各个大侠。先行谢过,请给我一点指示。问题如下:
原来的项目是一个总控模块,三个子模块,都是exe的。现在要把一个子模块变成一个dll,然后全面实现原来的功能。,问题是要在总控模块中真接调原来这个dll中几个类的成员函数,还要让它响应原来的timer,设timer要在总控模块中进行。该如何做呢。急急!!!!!!!!!!!!!!!在线等待
原来的项目是一个总控模块,三个子模块,都是exe的。现在要把一个子模块变成一个dll,然后全面实现原来的功能。,问题是要在总控模块中真接调原来这个dll中几个类的成员函数,还要让它响应原来的timer,设timer要在总控模块中进行。该如何做呢。急急!!!!!!!!!!!!!!!在线等待
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
timer可以是回调函数或是窗口类的成员函数,后者与窗口句柄(HWND)相关。
将DLL中的导出,exe不就可以直接使用了吗?
响应timer,可以把dll中窗口的句柄传进来,然后在主窗口设置定时器
然后就和WinMain中一样.....
CTestDlg
{
void Scplay(); //控制media play s 要用定时器
void Scstop();
}
CTestDlg::OnTimer()
{..............
case 10:
Scplay();
break;
case 20:
Scstop();
break;
}
然后我定义了
extern "C" _declspec(dllexport) void mc_Func03(HWND hWnd) {
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
g_FinishTimer = SetTimer(hWnd,10, 500,NULL);
g_nWinampPauseSp = 0;
CTestDlg::RestoreWinamp(1); \\这个控制winamp,我把它定义成static 的,然后这样引出的。不知道还有其它的引出成员函数方法吗?我用了一个CTestDlg指针,引是引出了。在调用方也引入了,并且dumpbin 也看到了。运行时一加载lib 就报错说函数找不到执行点。我狂晕!!!!!!!!。没办法声明成静态的。可是Scplay(),Scstop() 不能是静态的。
TRACE("finish \r\n");
}在主调方我这样用的。
case WM_SCRING:
hWnd_mc = ::FindWindow(NULL, LPCTSTR("MediaPlayerCtrl"));\\这个是CTestDlg title,在DEBUG下看没有抓到,是0。不知道能抓到吗?
mc_Func02(hWnd_mc);
break;
原来在DLL模块的APP的InitInstance();中有个
CTestDlg m_Dlg;
m_pMainWnd = &m_Dlg;
m_Dlg.DoModal();
结果主调方一运行,一出来对话框就不动了。后来我把doModal()去掉了。程序成功运行了。
程序执行后winamp停了 mediaplayer照样在唱。我头都大了。请各位高人们救救我。
CTestDlg m_Dlg(CWnd::FromHandle(hWnd));
m_pMainWnd = &m_Dlg;
m_Dlg.DoModal();hWnd-->调用程序的窗口句柄,传过来。
m_pMainWnd = &m_Dlg;
m_Dlg.DoModal();
这段程序一定要放在InitInstance()里吗?