2016-12-21 1 views
0

Ich habe ein ATL/COM Outlook-AddIn, das aktiviert wird, wenn der Benutzer versucht, eine E-Mail zu senden. Wenn der Sendetaste geklickt wird, erscheint eine DialogBox. Dort möchte ich den Betreff der Mail in eine TextBox setzen und diesen auf den Betreff umschreiben, wenn die OK-Taste angeklickt wird. Dies sollte in der Callback-Funktion der DialogBox erfolgen. Hier ist, was ich habe, so weit:C++ Abrufen und setzen Werte von DialogBox in Callback-Funktion

static BSTR myGlobalVar; 

void __stdcall OnItemSend(IDispatch* Item, VARIANT_BOOL* Cancel) 
{ 
    CComPtr<Outlook::_MailItem> mail; 
    HRESULT hr = Item->QueryInterface(__uuidof(Outlook::_MailItem), (void**)&mail); // get the mail item 

    if (hr == S_OK) 
    {   
     IUnknown* mapiItem; 
     if (mail->get_MAPIOBJECT(&mapiItem) == S_OK) 
     { 
      mail->get_Subject(&myGlobalVar); // get the current subject 

      DialogBox(GetModuleHandle(L"MyDllName.dll"), (LPCWSTR)IDD_DIALOG1, 0, (DLGPROC)About); // open the DialogBox 

      // here I want to set the subject with the value from the TextBox 
      mail->put_Subject(&myGlobalVar); 
     } 
    } 
} 

// this is the callback function of the DialogBox 
static LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     case WM_INITDIALOG: 
      { 
       // I want to set the value of IDC_MYTEXT to the subject, 
       // but I cannot access any global variables from here 
       SetDlgItemText(hDlg, IDC_MYTEXT, myGlobalVar); 

       return TRUE; 
      } 

     case WM_COMMAND: 
      if (LOWORD(wParam) == IDOK) 
      { 
       TCHAR szBuf[128]; 
       GetDlgItemText(hDlg, IDC_MYTEXT, szBuf, 128 - 1); 

       // here I want to set an global accessable variable 
       myGlobalVar = (BSTR)szBuf; 

       EndDialog(hDlg, LOWORD(wParam)); 
       return TRUE; 
      }    

      break; 
    } 
    return FALSE; 
} 

In der Callback-Funktion, die ich keine globalen Variablen zugreifen können, die in OnItemSend ebenfalls vorhanden sein würde, weil ich einen Linkerfehler LNK2001 erhalten. Was wäre ein guter Ansatz, um dies zu erreichen? Danke im Voraus!

Antwort

0

Ich habe es schließlich funktioniert, indem Sie die gesamte Dialogbehandlung in einer Klasse umhüllen und eine Instanz dieser Klasse in meiner OnItemSend-Funktion erstellen. Dann kann ich öffentliche Eigenschaften aus meiner Funktion und der statischen Callback-Funktion abrufen und setzen.