2013-10-08 7 views
-2

Я пытаюсь создать простую dll с файлом .rc с простым диалоговым окном и списком в нем. Я создал ресурс с помощью визуальной студии и с помощью перетаскивания элементов управления. Я выставил функцию, которая является статическими вызовами. DialogBox() API.Win32 GUI: не удалось создать диалог Win32 GUI

Я динамически загружаю dll из приложения с образцами окон и вызываю открытую функцию. создание диалогового окна с кодом ошибки 126

Может ли кто-нибудь помочь мне, почему он так себя ведет?

Вот код:

INT_PTR CALLBACK WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 

    case WM_INITDIALOG: 
     { 
       InitCommonControls(); 
       PopulateList(hwndDlg); 
       return TRUE; 
     } 
    case WM_COMMAND: 
     { 
      switch(wParam) 
      { 
      case IDOK: 
       SaveSelectedItem(hwndDlg); 
       EndDialog(hwndDlg,0);  
       return TRUE; 
     case IDCANCEL: 
       EndDialog(hwndDlg, 0); 
       return TRUE; 

      } 

     } 
    default: 
     DefWindowProc(hwndDlg, uMsg, wParam, lParam); 

    } 
} 
HINSTANCE gInstance; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
DialogBox(gInstance, MAKEINTRESOURCE(IDD_DIALOG), hwnd, WndProc); 

return TRUE; 
} 
+0

Является ли ваша программа вызовом 'InitCommonControlsEx()'? –

+1

Можете ли вы показать строку или два кода? –

+0

Где мой код? Я не вижу кода. –

ответ

0

Вы никогда не назначать gInstance и поэтому по умолчанию инициализируется NULL. Затем вы передаете это DialogBox.

Присвоить hInstance до gInstance в WinMain.

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
    gInstance = hInstance; 
    DialogBox(gInstance, MAKEINTRESOURCE(IDD_DIALOG), hwnd, WndProc); 
    return TRUE; 
} 

Или просто избавиться от gInstance вообще, так как вы не используете его в другом месте. Удалить переменную и сделать свой WinMain так:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), hwnd, WndProc); 
    return TRUE; 
} 

Существует еще код, который вы пропускаете хотя, потому что я не могу видеть декларацию или инициализацию hwnd. Всегда лучше показать полный SSCCE, если это возможно, и это, безусловно, возможно здесь.

Также обратите внимание на комментарий Раймонда к вопросу и переведите вызов InitCommonControls в WinMain.

Смежные вопросы