コールバック関数のみを使用して、CDialog から派生したダイアログの編集フィールドを文字列で更新する MFC dll サンプルを必死に探しています。静的関数は、カルバックで使用される関数であることを認識しています。
1 に答える
0
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);
dll の cpp ファイルで、次のように指定します。
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);
}
于 2012-12-17T01:46:00.320 に答える