Visual studio 调用程序主对话框的dll

Visual studio 调用程序主对话框的dll,visual-studio,mfc,Visual Studio,Mfc,我绝望地搜索MFC dll示例,该示例仅使用回调函数使用字符串更新从CDialog派生的对话框上的编辑字段。我意识到静态函数是calback中使用的函数。我想您应该意识到dll应该有一些东西(比如一个单独的线程,或者这个模型的某个第三方消息处理程序)。因此,这超出了这个问题的范围 回到问题上来: 为了创建回调函数,您需要“typedef”其原型,并将此函数的地址从调用应用程序传递到dll。在dll“h”文件中指定: // This is the Mfcdll1.h header file //

我绝望地搜索MFC dll示例,该示例仅使用回调函数使用字符串更新从CDialog派生的对话框上的编辑字段。我意识到静态函数是calback中使用的函数。

我想您应该意识到dll应该有一些东西(比如一个单独的线程,或者这个模型的某个第三方消息处理程序)。因此,这超出了这个问题的范围

回到问题上来: 为了创建回调函数,您需要“typedef”其原型,并将此函数的地址从调用应用程序传递到dll。在dll“h”文件中指定:

// This is the Mfcdll1.h header file
// You should have some code created by the wizard, similar to the following:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

// This is the typedef for your callback function type:
typedef void (CALLBACK* MY_DLL_CALLBACK)
(
 LPVOID lpParam,
 LPCTSTR lpszMessage
);

class CMyDllApp : public CWinApp
{
public:
  CMyDllApp();
  // etc.


  void SetCallBack(MY_DLL_CALLBACK pCallback, LPVOID pCallbackParm){m_pCallback = pCallback; m_pCallbackParm = pCallbackParm;}

private:
  MY_DLL_CALLBACK m_pCallback;
  LPVOID m_pCallbackParm;
};

MYDLL_API void SetCallBack(MY_DLL_CALLBACK pCallback, LPVOID pCallbackParm);
CMyDllApp::CMyDllApp()
{
  m_pCallback = NULL;
  m_pCallbackParm = NULL;
}

MYDLL_API void SetCallBack(MY_DLL_CALLBACK pCallback, LPVOID pCallbackParm)
{
  theApp.SetCallBack(pCallback, pCallbackParm);
}
在dll的cpp文件中指定以下内容:

// This is the Mfcdll1.h header file
// You should have some code created by the wizard, similar to the following:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

// This is the typedef for your callback function type:
typedef void (CALLBACK* MY_DLL_CALLBACK)
(
 LPVOID lpParam,
 LPCTSTR lpszMessage
);

class CMyDllApp : public CWinApp
{
public:
  CMyDllApp();
  // etc.


  void SetCallBack(MY_DLL_CALLBACK pCallback, LPVOID pCallbackParm){m_pCallback = pCallback; m_pCallbackParm = pCallbackParm;}

private:
  MY_DLL_CALLBACK m_pCallback;
  LPVOID m_pCallbackParm;
};

MYDLL_API void SetCallBack(MY_DLL_CALLBACK pCallback, LPVOID pCallbackParm);
CMyDllApp::CMyDllApp()
{
  m_pCallback = NULL;
  m_pCallbackParm = NULL;
}

MYDLL_API void SetCallBack(MY_DLL_CALLBACK pCallback, LPVOID pCallbackParm)
{
  theApp.SetCallBack(pCallback, pCallbackParm);
}
现在,如果dll要调用回调函数,则只需执行以下操作:

CMyDllApp::SendCallbackToTheCaller(LPCTSTR lpszMessage)
{
  if(m_pCallback) (*(m_pCallback))(m_pCallbackParm, lpszMessage);
}
在此阶段,您已经在dll中完成了编码。现在,您只需在对话框中指定静态回调函数,该函数将更新您的编辑控件,如下所示: 在h文件中:

// TestDlg.h  - My Test dialog with the Edit Control
CTestDlg: public CDialog
{
  public:
  static void CALLBACK StatusCallback(LPVOID lpParam, LPCTSTR lpszMessage);
};
在cpp文件中:

BOOL CTestDlg::OnInitDialog()
{
  CDialog::OnInitDialog();

  // Insert this line along your stuff
  ::SetCallback((MY_DLL_CALLBACK)StatusCallback, (LPVOID)this);
}

void CALLBACK CTestDlg::StatusCallback(LPVOID lpParam, LPCTSTR lpszMessage)
{
  CTestDlg* pTestDlg = reinterpret_cast<CTestDlg*>(lpParam);
  ASSERT(pTestDlg!=NULL);
  pTestDlg->m_edStatus.SetWindowText(lpszMessage);
}
boolctestdlg::OnInitDialog()
{
CDialog::OnInitDialog();
//沿着你的东西插入这条线
::SetCallback((MY_DLL_CALLBACK)StatusCallback,(LPVOID)this);
}
void CALLBACK CTestDlg::StatusCallback(LPVOID lpParam、LPCTSTR lpszMessage)
{
CTestDlg*pTestDlg=重新解释铸件(lpParam);
断言(pTestDlg!=NULL);
pTestDlg->m_edStatus.SetWindowText(lpszMessage);
}

非常感谢。在这种情况下,CTestDlg是从CDialog派生的。如果CTestDlg是从CPropertyPage派生的,怎么样?还有,你的意思是什么?“我想你应该意识到dll应该有一些东西(比如一个单独的线程,或者这个模型的某个第三方消息处理程序。因此,这超出了这个问题的范围。”1.CTestDlg可以从任何对象传递。它的内存地址很重要。当调用SetCallback()API时,传递定义回调处理程序的对象的地址。2.在dll(上面示例中的CMYDLApp)中,必须有调用SendCallbacktoCaller()的对象。这将是一个单独的线程,或者是一个通过回调函数发回消息的用户进程。