-2

シンプルなダイアログボックスとリストボックスを含む.rcファイルを持つシンプルなdllを作成しようとしています。Visual Studio の助けを借りて、コントロールをドラッグ アンド ドロップしてリソースを作成しました。DialogBox() APIを呼び出すインターンである関数を公開しました。

サンプル Windows アプリケーションから 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;
}
4

1 に答える 1

0

に割り当てることはないgInstanceため、デフォルトで に初期化されNULLます。次に、それを に渡しDialogBoxます。

に割り当てhInstanceます 。gInstanceWinMain

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 に移動します。

于 2013-10-09T13:04:35.270 に答える