2013-09-18 3 views
-1

У меня есть C++ dll, использующая другое программное обеспечение. Мне нужно, когда программа вызывает одну функцию этой DLL, она показывает один диалог для получения пользователя/pwd. Мой код до работы, но в это время не работает.Win32 CreateDialogParam Not Works

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 и скомпилировал без проблем. но при вызове этой функции он не работает и не отображает диалоговое окно. Любая ошибка в моем коде? С уважением,

+0

'CreateDialogParam' действительно работает. Да, в вашем коде есть ошибка. Какую отладку вы сделали до сих пор? Я не вижу никакой проверки возвращаемых значений в вашем коде. Почему нет? –

+0

Он должен вернуть значение результата, 0 или 1. Как я уже говорил, этот код работал для меня. Я скомпилирован как режим Debug & Release и попробую dll, но не работает снова. – user2769769

+1

Нет, вы вызываете много вызовов API Win32 и не проверяете возвращаемое значение. Шаг 1 - добавить к вашему коду обработку ошибок. –

ответ

0

CreateDialogParam() работает, но не требуется в вашем примере, поскольку вы не пытаетесь передать параметр обработчику WM_INITPARAM wndproc. Поэтому лучшей функцией будет CreateDialog().

И кажется, что вы хотите «возможно, экран Логин», который будет модальным, поэтому правильная функция, вероятно, будет

DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc) 

Трудно предложить гораздо больше помощи, чем это потому, что ваш вопрос перемешаны

  1. Я не думаю, что код когда-либо работал, так много ошибок в нем
  2. Непонятно, зачем это нужно в DLL.
  3. Фактическая проверка безопасности (которая абсолютно небезопасна) даже не принимает пользователя в качестве параметра.

Возможно, вам стоит начать немного проще и просто создать свое диалоговое окно (независимо от его возможного использования) в исполняемом файле WinMain().

После того, как вы действительно получили эту работу, тогда, если вы все еще не можете передать код в DLL, вернитесь и задайте более целенаправленный вопрос.