2016-12-21 9 views
0

У меня есть ATL/COM Outlook-AddIn, который активируется, когда пользователь пытается отправить почту. Если нажать кнопку отправки, появится диалоговое окно «Диалоговое окно». Там я хочу установить тему письма в TextBox и переписать это для субъекта, если нажать кнопку OK. Это должно быть сделано в функции обратного вызова DialogBox. Вот то, что я до сих пор:C++ получить и установить значения из DialogBox в функции обратного вызова

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; 
} 

В функции обратного вызова я не могу получить доступ к любому глобальные переменные, которые будут доступны в OnItemSend, а также, потому что я получаю LNK2001 ошибки линкера. Что было бы хорошим подходом к достижению этого? Заранее спасибо!

ответ

0

Я, наконец, получил его, обернув всю обработку диалогового окна в классе и создав экземпляр этого класса в моей функции OnItemSend. Затем я могу получить и установить общедоступные свойства внутри моей функции и статической функции обратного вызова.