Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Криво пример написал, так покозырней будет
    Не буду расписывать присваивания имён, смысл обращаться ко всем присутствующим строкам.

    Вариант 1:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost
    SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost
    Microsoft\Windows NT\CurrentVersion\SvcHost
    Windows NT\CurrentVersion\SvcHost
    CurrentVersion\SvcHost
    SvcHost

    Вариант 2:
    HKEY_LOCAL_MACHINE\
    SOFTWARE\
    Microsoft\
    Windows NT\
    CurrentVersion\
    SvcHost\n
     
  2. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Ошибся \n, конечно \0
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ну так и преобразуй в отдельные символы.
     
  4. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Столкнулся с полнейшей фигнёй...
    Если указать свою точку входа:
    #pragma comment(linker, "/ENTRY:prMain")
    то после вызова SHBrowseForFolder с флагом BIF_NEWDIALOGSTYLE программа не выгружается из памяти.
    //Тупейший пример
    CoInitialize(NULL);
    SHBrowseForFolder(&BrInf);
    CoUninitialize();
    return 0;
    Если заменит return на ExitProcess - выгружается
    Если не менять точку входа - выгружается
    Если не использовать BIF_NEWDIALOGSTYLE - выгружается
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    MirrorBlack
    ExitProcess - завершает все потоки программы. При использовании CRT (стандартная точка входа) она вызывается "автоматически".
    А после return 0, win автоматически завершает только текущий поток, что достаточно для однопоточных программ, но не подходит для тех где дополнительные потоки создаются неявно - как раз твой случай.
     
  6. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Y_Mur
    После return 0 разве не должен быть вызван ExitProcess?
    И о каком неявном потоке идёт речь?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    После return 0 win делает только ExitTread, а твой диалог нового стиля создаёт себе дополнительный поток, который и остаётся незавершённым.
     
  8. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Y_Mur
    А как быть с деструкторами объектов если вызывать ExitProcess?
    Или проще не парится и не менять точку входа?
     
  9. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Y_Mur
    И может подскажеш как завершить ентот диалог.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    MirrorBlack
    Можешь, например, определить дополнительную функцию main, вызываемую из входной __main, тогда при return 0; в main будут вызваны все деструкторы, а __main оставь только ExitProcess(main());
    Как завершить поток диалога без ExitProcess не знаю, и думаю такому вопросу место в разделе RESEARCH, поскольку это разбор внутренностей win и к С++ он отношения не имеет.
     
  11. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Подскажите, можно это записать проще:
    szSystemDirectory[uiSize] = WCHAR('\\');
    szSystemDirectory[uiSize+1] = WCHAR('\0');
     
  12. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    Код (Text):
    1. wcscat(&szSystemDirectory[uiSize], "\\");
     
  13. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    LLInuoH
    Это типа вместо того чтоб DWORD положить мы копирование строки включаем...
    Не наши это методы :)
     
  14. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Причём даже не копирование а объединение.
     
  15. newbie553

    newbie553 New Member

    Публикаций:
    0
    Регистрация:
    1 май 2009
    Сообщения:
    20
    часть кода:
    HWND hwnd;
    LPTSTR p;
    hwnd = GetDesktopWindow();
    hwnd = GetWindow(hwnd, GW_CHILD);
    hwnd = GetWindow(hwnd, GW_HWNDNEXT);
    GetWindowText(hwnd, p, 100);
    cout << p << endl;

    вместо названия окна выводит какой-то дворд. как я понимаю, это адрес начала строки. как получить доступ к самой строке? в примере вместо LPTSTR использовался char p[100]; , но с ним компилятор выдает ошибку.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    newbie553
    Что за компилятор такой странный?
    Код (Text):
    1. char p[MAX_PATH];
    2. GetWindowText(hwnd, p, MAX_PATH);
     
  17. newbie553

    newbie553 New Member

    Публикаций:
    0
    Регистрация:
    1 май 2009
    Сообщения:
    20
    Booster, error C2664: 'GetWindowTextW' : cannot convert parameter 2 from 'char [260]' to 'LPWSTR'
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    newbie553
    Код (Text):
    1. wchar_t p[MAX_PATH];
    2. GetWindowText(hwnd, p, MAX_PATH);
    3. std::wcout << p << std::endl;
     
  19. newbie553

    newbie553 New Member

    Публикаций:
    0
    Регистрация:
    1 май 2009
    Сообщения:
    20
    Booster
    на
    std::wcout << p << std::endl;
    выводит пустую строку
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    newbie553
    Значит пустая.