Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 16.12.2013, 17:00   #31
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 4,660
Репутация: 1426
По умолчанию

Возвращайте VARIANT, он для этого и придуман
Далее, если будете выводить на экран, то все равно будете приводить к string, так что можете это сделать прямо при получении варианта.
waleri вне форума   Ответить с цитированием
Старый 16.12.2013, 19:49   #32
hvz-
Форумчанин
 
Регистрация: 15.11.2010
Сообщений: 138
Репутация: 15
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Возвращайте VARIANT, он для этого и придуман
Далее, если будете выводить на экран, то все равно будете приводить к string, так что можете это сделать прямо при получении варианта.
Но моя функция(пример из мсдн) в цикле создаёт эту структуру, а потом в конце цикла освобождает(но я закомментил). Надо перед циклом сделать "общий" вариант, например массив и туда по очереди пихать данные а потом возвращать?
Или, например, можно использовать LIMIT 0,1 в WQL запросе(ещё не тестил, так что это только теория) что бы уж точно получить одно значение, а там посылать его на VARIANT и уже отправлять? Спрашиваю, т.к. живой пример - взятие названия видеокарты, а в моём ноутбуке их 2, соотв. уже нужен массив структуры VARIANT? Та же самая проблема (по крайней мере у меня в голове) на счёт получения списка процессов в системе, ведь там то же будет не одна запись.
Если я задаю слишком глупые вопросы, то извиняйте, но пример из мсдна немного сбивает с толку.
hvz- вне форума   Ответить с цитированием
Старый 23.12.2013, 19:05   #33
hvz-
Форумчанин
 
Регистрация: 15.11.2010
Сообщений: 138
Репутация: 15
По умолчанию

И снова я с вопросом
Появилась проблема с переводом из BSTR в число, а именно вытягивание свойства Win32_ComputerSystem.TotalPhysicalM emory, само свойство класса типа uint64 (в документации указано), а на деле оказалось что uint64 WMI пихает в строку типа BSTR.

Но как я начал пробовать переводить эту строку в число, начинаются проблемы. Использовал wcstol(), _wtoi(), _wtoi64(), _com_util::ConvertBSTRToString(), так же переводы в другие типы а из них в число - или без толку, или всегда показывал 2 гигабайта(выводил с парсингом - делил).
Заметил, что у меня на ноуте 2 оперативы - одна на 2 гигабайта, вторая на 4.
Почему же, если в строке типа BSTR поделить число выходит мои 6 гигабайтов, а если начинаю переводить функциями _wtoi() / _wtoi64() то получаю 2 гигабайта? Перевожу так:
Код:

TCHAR tRAMquantity[OUTPUT_SIZE];
_stprintf_s(tRAMquantity, TEXT("RAM:\t\t%s"), vRAMquant.bstrVal); // Так работает сейчас

_stprintf_s(tRAMquantity, TEXT("RAM:\t\t%d"), (_wtoi(vRAMquant.bstrVal)+1)/1024/1024); // Так получаю -2048(почему отрицательное?), прибавляю единичку т.к. 1 байт почему то теряется

_stprintf_s(tRAMquantity, TEXT("RAM:\t\t%d"), _wtoi(vRAMquant.bstrVal)/1024/1024); // Так получаю 2047

wchar_t *pEnd;
_stprintf_s(tRAMquantity, TEXT("RAM:\t\t%ld MB"), wcstol(vRAMquant.bstrVal, &pEnd, 10)/1024/1024); // Так получаю 2047

В чём моя ошибка? Я в полном тупике

Последний раз редактировалось hvz-; 23.12.2013 в 19:23.
hvz- вне форума   Ответить с цитированием
Старый 23.12.2013, 19:52   #34
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 4,660
Репутация: 1426
По умолчанию

6GB числом не влезают в 32бит переменную.
Используйте LONG LONG тип и функцию _wtoi64()
waleri вне форума   Ответить с цитированием
Старый 23.12.2013, 20:38   #35
hvz-
Форумчанин
 
Регистрация: 15.11.2010
Сообщений: 138
Репутация: 15
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
6GB числом не влезают в 32бит переменную.
Используйте LONG LONG тип и функцию _wtoi64()
Сначала не получилось, но потом ошибку нашёл и исправил. Спасибо за совет.
Для тех, кому интерестно:
Код:

_stprintf_s(tRamCapacity, TEXT("Capacity:\t%lld MB"), _wtoi64(vRamCapacity.bstrVal)/1024/1024);

Скорее всего, предыдущие способы у меня не работали т.к. я указывал не верный формат вывода, в данном случае использовал %lld.

Последний раз редактировалось hvz-; 23.12.2013 в 20:43.
hvz- вне форума   Ответить с цитированием
Старый 06.01.2014, 03:47   #36
hvz-
Форумчанин
 
Регистрация: 15.11.2010
Сообщений: 138
Репутация: 15
По умолчанию

Доброго времени суток! Наверное, поднимаю тему в последний раз
Благодаря помощи на этом форуме(спасибо всем вам!) моя первая более менее серьёзная программа практически завершена - осталось приделать "динамичность" одной из вкладок. Да, я поднимал в этой теме этот вопрос ранее, но к решению так и не пришёл. Прошу помощи форумчан в этом не лёгком для меня вопросе. Прилагаю проект.
Так же хотелось, что бы оценили качество построения программы, т.к. опыта в это никакого. С удовольствием выслушаю вашу критику и предложения!
hvz- вне форума   Ответить с цитированием
Старый 13.01.2014, 04:48   #37
hvz-
Форумчанин
 
Регистрация: 15.11.2010
Сообщений: 138
Репутация: 15
По умолчанию

Цитата:
Сообщение от hvz- Посмотреть сообщение
Доброго времени суток! Наверное, поднимаю тему в последний раз
Благодаря помощи на этом форуме(спасибо всем вам!) моя первая более менее серьёзная программа практически завершена - осталось приделать "динамичность" одной из вкладок. Да, я поднимал в этой теме этот вопрос ранее, но к решению так и не пришёл. Прошу помощи форумчан в этом не лёгком для меня вопросе. Прилагаю проект.
Так же хотелось, что бы оценили качество построения программы, т.к. опыта в это никакого. С удовольствием выслушаю вашу критику и предложения!
Форумчане, где же вы? Новых идей в мою голову так и не пришло
hvz- вне форума   Ответить с цитированием
Старый 22.01.2014, 03:18   #38
hvz-
Форумчанин
 
Регистрация: 15.11.2010
Сообщений: 138
Репутация: 15
По умолчанию

Ну что ж, если с таймером никак, тогда есть вопрос по поводу смены заднего фона у статического текста.
Сделал для себя одну функцию, которая создаёт текст и присваивает ему шрифт:
Код:

HWND CreateText(int pos_x, int pos_y, int size_x, int size_y, TCHAR *tText, HWND *hWindow)
{
	HWND hText;
	HFONT hFont;
	hFont = CreateFont(13, 0, 0, 0, FW_MEDIUM, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Tahoma"));

	hText = CreateWindow(TEXT("static"), tText, WS_OVERLAPPED | WS_CHILD | WS_VISIBLE, pos_x, pos_y, size_x, size_y, *hWindow, (HMENU)NULL, GetModuleHandle(NULL), NULL);
	SendMessage(hText, WM_SETFONT, (WPARAM)hFont, TRUE);
	SendMessage(hText, WM_CTLCOLORSTATIC, (WPARAM)GetDC(hText), TRUE);

	return hText;
}

Как видите, в конце посылаю сообщение окну WM_CTLCOLORSTATIC, в процедуре обработки оконных сообщений обрабатываю так:
Код:

case WM_CTLCOLORSTATIC:
    		SetBkMode((HDC)wParam,TRANSPARENT);
    		SetTextColor((HDC)wParam, RGB(255,0,0));
    		return (BOOL)CreateSolidBrush (GetSysColor(COLOR_MENU));
			break;

В чём же проблема? Почем не меняется задний фон текста?
Вот собственно проблема:
hvz- вне форума   Ответить с цитированием
Старый 22.01.2014, 14:48   #39
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 4,660
Репутация: 1426
По умолчанию

Самому себе WM_CTLCOLORSTATIC посылать нет смысла - это сообщение посылается контролами в свой диалог дабы затребовать цвет и т.д. В вашем случае будет посылаться в hWindow.

Кстати, у вас будет дикая утечка ресурсов - никто не удаляет brush а это сообщения отправляется каждый раз, когда рисуется контрол.
waleri вне форума   Ответить с цитированием
Старый 22.01.2014, 22:55   #40
hvz-
Форумчанин
 
Регистрация: 15.11.2010
Сообщений: 138
Репутация: 15
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Самому себе WM_CTLCOLORSTATIC посылать нет смысла - это сообщение посылается контролами в свой диалог дабы затребовать цвет и т.д. В вашем случае будет посылаться в hWindow.

Кстати, у вас будет дикая утечка ресурсов - никто не удаляет brush а это сообщения отправляется каждый раз, когда рисуется контрол.
Спасибо за развёрнутый ответ!
Как тогда поступить в моём случае? Как мне убрать этот серый фон?
hvz- вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мониторинг системных ресурсов С++ Serjik-ahaha Общие вопросы C/C++ 1 18.10.2012 11:47
Мониторинг shtep PHP 1 06.02.2012 10:37
Мониторинг ОС Smile08 Безопасность, Шифрование 3 08.11.2010 17:00
Мониторинг удаленного компьютера NBAH1990 Общие вопросы Delphi 4 28.02.2010 09:35
Мониторинг CS bookkc Фриланс 4 09.01.2010 19:17




12:08.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru