【问题标题】:C++ get and set values from DialogBox in Callback functionC ++从回调函数中的对话框获取和设置值
【发布时间】:2016-12-21 14:08:33
【问题描述】:

我有一个 ATL/COM Outlook-AddIn 在用户尝试发送邮件时被激活。如果单击发送按钮,则会出现一个对话框。在那里,我想在 TextBox 中设置邮件的主题,如果单击“确定”按钮,则将其重写为主题。这应该在 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。什么是实现这一目标的好方法?提前致谢!

【问题讨论】:

    标签: c++ callback dialog global-variables outlook-addin


    【解决方案1】:

    我终于通过将整个对话处理包装在一个类中并在我的 OnItemSend 函数中创建这个类的一个实例来让它工作。然后我可以从我的函数和静态回调函数内部获取和设置公共属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多