Win32 CreateDialogParam 不起作用

Win32 CreateDialogParam Not Works

本文关键字:不起作用 CreateDialogParam Win32      更新时间:2023-10-16

我C++另一个软件使用它。我需要当软件调用这个dll的一个函数时,它会显示一个用于获取用户/pwd的对话框。我的代码以前有效,但此时不起作用。

    INT_PTR CALLBACK DialogFunc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        g_hInstance = hModule;
        bRun = FALSE;
        dwNewLong = 0;
        g_Msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
        g_hWnd = FindWindowA("TForm1", "Form1");
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
HWND hWnd1;
int nRet;

char b1[]="VALID";

HWND g_hDlg2,hWnd,hDlg2,hDlg3;
INT_PTR CALLBACK DialogFunc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

    switch(uMsg)
    {
    case WM_INITDIALOG:
        read(f1);
        read1(f2);
        hDlg1=GetDlgItem(hDlg,IDC_EDIT1);
        SetWindowTextA(hDlg1,UserSaved);
        hDlg2=GetDlgItem(hDlg,IDC_EDIT2);
        SetWindowTextA(hDlg2,PWDSaved);
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDC_BUTTON2:
            hDlg3=hDlg;
            GetWindowText(hDlg1,username,1024);
            write(f1);
            GetWindowText(hDlg2,key,1024);
            write1(f2);
            if(memcmp(Get_Account_Number_FromWEB(),b1,sizeof(b1))==0 ){result=1; DestroyWindow(hDlg);}
            else MessageBox(0,TEXT("Wrong User or PWD"),0,0);
            break;
            case IDC_BUTTON3:
                DestroyWindow(hDlg);
                break;
                case IDC_EDIT1:
                 break;
            case IDC_EDIT2:
              break;
        }
        break;
    case WM_CLOSE:
        SetWindowLongA(hDlg, GWL_WNDPROC, dwNewLong);
        DestroyWindow(hDlg);
        return TRUE;
        break;
    }
    return FALSE;
}
int aa=0;
HWND hWnd2;
int dd;
HWND hDlg;
MT4_EXPFUNC int __stdcall INITIAL(HWND hWnd)
{
    MSG msg; 
    BOOL msgstatus;
     if(aa==0){
    hDlg = CreateDialogParamA(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1 ), hWnd, DialogFunc, 0);
     SetWindowPos( hDlg, HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | WS_EX_TOPMOST );
     ShowWindow(hDlg, SW_SHOW);
    aa=1;
    }

    dd=result;
    hWnd2=hWnd;
    return  result;
}

我也向dll添加了资源并且可以毫无问题地进行编译。 但是当调用此函数时,它不起作用并且不显示对话框。我的代码中有任何错误吗?问候

CreateDialogParam() 确实有效,但在您的示例中不是必需的,因为您没有尝试将参数传递给 WM_INITPARAM wndproc 处理程序。 所以更好的函数是 CreateDialog()。

而且似乎您想要"也许是一个登录屏幕",这将是模态的,因此正确的功能可能是

DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc)
很难

提供比这更多的帮助,因为您的问题很混乱

  1. 我不认为代码曾经工作过,其中有很多错误
  2. 目前尚不清楚为什么要在 DLL 中使用它。
  3. 实际的安全"检查"(完全不安全)甚至不接受用户作为参数。

也许您应该从更简单的开始,并在 WinMain() 可执行文件中创建对话框(无论最终使用什么)。

一旦你真的让它工作了,那么,如果你仍然无法将代码传输到DLL,那么回来问一个更集中的问题。