在mfc dll的InitInstance()方法中创建对话框实力并且进行显示,在调用dll的时候窗体会一闪而过。

CDLGTEST*dlg;BOOLCTestApp::InitInstance(){dlg=newCDLGTEST;dlg->Create(IDD_DIA_TEST);d... CDLGTEST *dlg;
BOOL CTestApp::InitInstance()
{
dlg=new CDLGTEST;
dlg->Create(IDD_DIA_TEST);
dlg->ShowWindow(SW_SHOWNORMAL);
return CWinApp::InitInstance();
}
后来查阅资料说是得加入消息循环,代码如下:
CDLGTEST *dlg;
BOOL CTestApp::InitInstance()
{
dlg=new CDLGTEST;
dlg->Create(IDD_DIA_TEST);
dlg->ShowWindow(true);
while(::GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return CWinApp::InitInstance();
}
似乎问题还是解决不了,一闪而过的问题没了,但是这样下来被注入的程序(记事本无响应),注入程序也是无响应,有相应的只有IDD_DIA_TEST窗体,好像主线程进入了while后,一直在处理消息问题,后来用线程来处理消息循环,更是得不到消息信息,困扰几天的问题,实在解决不了了,还请师哥师姐们多多指点。。。小弟万分感激。谢谢
展开
 我来答
龚炜林
2012-12-28 · TA获得超过1560个赞
知道大有可为答主
回答量:1102
采纳率:66%
帮助的人:583万
展开全部
我先问一下你在使用dll的时候,如何调用Dll的东东创建对话框的?
追问
我直接将InitInstance函数另起一个名字作为DLL输出函数,直接调用的。
追答
这样是不行的。其实你摸到了问题了,就是你之前的做法是想用CWinApp建立对话框,而实际上,这个CWinApp在MFC运行时是代替了WinMain函数,其在WinMain中被调用,且除了Instance需要调用它的Run函数。而对话框机制下确实是在这个InitInstance里面一直处理消息循环的:
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
不过这个是主对话框的情况,看你的对话框是非模态的,而你又没真正使用CWinApp的功能,所以最好只写一个函数创建对话框即可,且以调用这个线程的对话框为主对话框,这样,消息会由调用线程自动发送到该对话框。另外,不知道你是如何在线程处理消息循环的,而实际应该把对话框的创建都放到线程,因为GetMessage只从当前线程的消息队列获取消息,而你创建对话框如果在另一个线程,那么消息也处在另一个线程,如果消息处理却再开一个线程,那就取不了其消息。
个人不建议使用线程来创建。还有要注意IDD_DIA_TEST和你其它对话框的ID是否有重复。

至于那个一闪而过的问题:水平有限,也没遇到过你这种,如果可以,还望发送工程至gwlprogrammer@hotmail.com让我找找原因。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-12-28
展开全部
peekmessage
试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式