Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как использовать string в Win32API, неполучается использовать функцию append 
V
    Опции темы
wallstreet
Дата 13.6.2012, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Всем доброго времени суток. Вопрос наверняка элементарный, но меня он ставит в тупик.
Я создаю приложение Win32API в которое добавляю элемент управления Edit control и в 
которое стоит задача выводить информацию по открытым окнам на компе. Для сбора 
информации автор учебника предлагает мне воспользоваться классом string. Я, собственно,
не против. Для этого я записываю в мою строку заголовок, который будет над всей дальнейшей
информацией и потом к нему добавляю с помощью строчной (а может строковой) функции 
append() массив типа TCHAR и вот на этом этапе возникают траблы. 

немного кода:
Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static std::string st("hProcess   hParent   idProcess   hWindows\Title\r\n");
    HWND hFind;
    static HWND hEdit;
    TCHAR str[1024];
    TCHAR title[256];
    LONG  hProcess, hParentEdit;
    DWORD id;
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_CREATE:
        hEdit = CreateWindow(_T("Edit"), NULL, WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL, 
            0, 0, 0, 0, hWnd, (HMENU) 1, hInst, NULL);
        break;
    case WM_SIZE:
        MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (LOWORD(wParam))
        {
        case ID_FILE_FIND:
            hFind = GetTopWindow(NULL);
            do
            {
                hProcess = GetWindowLong(hFind, GWL_HINSTANCE);
                hParentEdit = GetWindowLong(hFind, GWL_HWNDPARENT);
                SendMessage(hFind, WM_GETTEXT, (WPARAM)256, (LPARAM)title);
                GetWindowThreadProcessId(hFind, &id);
                swprintf(str, _T("%.8x  %.8x   %.8d   %.8x         %s\r\n"),  hProcess, hParentEdit, id, hFind, title);
                st.append(str);
                hFind = GetWindow(hFind, GW_HWNDNEXT);
            }
            while(hFind);
            SetWindowText(hEdit, (LPCWSTR)st.c_str()); // Тут ругалось на несоответствие типа требуемуму(LPCWSTR) st.c_str()
            break;
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


вот ошибки:
Цитата

Warning    2    warning C4129: ' ' : unrecognized character escape sequence    c:\users\андрей\documents\visual studio 2010\projects\serchwindows\serchwindows\serchwindows.cpp    171    1    SerchWindows
    6    IntelliSense: too few arguments in function call    c:\users\андрей\documents\visual studio 2010\projects\serchwindows\serchwindows\serchwindows.cpp    173    18    SerchWindows
    5    IntelliSense: no instance of overloaded function "std::basic_string<_Elem, _Traits, _Ax>::append [with _Elem=char, _Traits=std::char_traits<char>, _Ax=std::allocator<char>]" matches the argument list    c:\users\андрей\documents\visual studio 2010\projects\serchwindows\serchwindows\serchwindows.cpp    173    7    SerchWindows
Error    4    error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::append(const std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 from 'TCHAR [1024]' to 'const std::basic_string<_Elem,_Traits,_Ax> &'    c:\users\андрей\documents\visual studio 2010\projects\serchwindows\serchwindows\serchwindows.cpp    173    1    SerchWindows



Это сообщение отредактировал(а) wallstreet - 13.6.2012, 12:41
PM MAIL   Вверх
Dem_max
Дата 13.6.2012, 12:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

swprintf(str, _T("%.8x  %.8x   %.8d   %.8x         %s\r\n"),  hProcess, hParentEdit, id, hFind, title);

так нельзя делать так str  = указателю на что-то, а не на начало строки.
делай так 
Код

TCHAR txt[500];
swprintf(txt, _T("%.8x  %.8x   %.8d   %.8x         %s\r\n"),  hProcess, hParentEdit, id, hFind, title);


Код

(LPCWSTR)st.c_str()


так бы я тоже не стал делать, вдруг у тебя  st тип char, а ты его пытаешься привести к типу wchar_t, что совсем не одно и тоже и жди косяков.

Это сообщение отредактировал(а) Dem_max - 13.6.2012, 12:47


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 13.6.2012, 12:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



+ st в данном случае несовместим с TCHAR,
его надо адаптировать к UNICODE-среде:
Код

static 
  #ifndef _UNICODE
std::string
  #else
std::wstring
  #endif
st( _T( "hProcess   hParent   idProcess   hWindows\Title\r\n" ) );



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
wallstreet
Дата 13.6.2012, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Цитата(GremlinProg @  13.6.2012,  12:51 Найти цитируемый пост)
+ st в данном случае несовместим с TCHAR,его надо адаптировать к UNICODE-среде:

Помогло, спасибо!! 
Кстати у меня в настройках проекта в Character Set установлено Use Unicode Character Set, разве компилятор (VS2010) не должен был понять что я работаю с юникодом? Или это проблема в функции, которая не имеет юникодного эквивалента?
PM MAIL   Вверх
GremlinProg
Дата 13.6.2012, 13:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(wallstreet @  13.6.2012,  15:33 Найти цитируемый пост)
Кстати у меня в настройках проекта в Character Set установлено Use Unicode Character Set, разве компилятор (VS2010) не должен был понять что я работаю с юникодом? Или это проблема в функции, которая не имеет юникодного эквивалента?

почти все функции имеют такой эквивалент,
для swprintf, например - это sprintf

компилятор не знает ничего о таких эквивалентах, этим занимается программист, поэтому и вместо swprintf следует указывать _stprintf


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0826 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.