MFC建立dll载入窗口问题

Eddie780 2016-02-24 07:08:42
你好,请问我使用远程注入了一个dll,在dll中显示窗口,窗口一闪而过了,该如何解决?
窗口的对象是全局变量。



// CMFC_dllApp 初始化

BOOL CMFC_dllApp::InitInstance()
{
CWinApp::InitInstance();


AfxMessageBox(_T("窗口准备弹出!!!"));
AFX_MANAGE_STATE(AfxGetStaticModuleState());
mainformhwnd = ph->m_hWnd;
ph->Create(IDD_DIALOG1);
ph->ShowWindow(SW_SHOW);
AfxMessageBox(_T("窗口已经弹出!!!现在能看到窗口!点了确定之后,窗口没了!ph是全局变量"));

return TRUE;
}
...全文
325 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eddie780 2016-02-25
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
[quote=引用 2 楼 Eddie780 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 加一个消息循环?
已成功!谢谢赵4老师!![/quote] 是用我这招吗?[/quote] 对的,加一个消息循环,不让他return出去。之前是用的while(true) 窗口会假死,肯定是没有把默认的消息传回给窗口导致的,按照你说的写了个while消息循环,窗口就OK了!~~
赵4老师 2016-02-25
  • 打赏
  • 举报
回复
引用 2 楼 Eddie780 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 加一个消息循环?
已成功!谢谢赵4老师!![/quote] 是用我这招吗?
赵4老师 2016-02-25
  • 打赏
  • 举报
回复
那就和这个例子代码的基本原理一脉相承(没消息循环Timer也不灵):
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
    struct tm *now;
    struct timeb tb;

    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc2\n");
}
int main() {
    int i;
    MSG msg;

    SetTimer(NULL,0,1000,myTimerProc1);
    SetTimer(NULL,0,2000,myTimerProc2);
    for (i=0;i<20;i++) {
        Sleep(500);
        log("In main\n");
        if (GetMessage(&msg,NULL,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

    }
    return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main
//2012-07-26 17:29:12.890 In myTimerProc1
//2012-07-26 17:29:13.390 In main
//2012-07-26 17:29:13.890 In myTimerProc2
//2012-07-26 17:29:14.390 In main
//2012-07-26 17:29:14.390 In myTimerProc1
//2012-07-26 17:29:14.890 In main
//2012-07-26 17:29:14.890 In myTimerProc1
//2012-07-26 17:29:15.390 In main
//2012-07-26 17:29:15.890 In myTimerProc2
//2012-07-26 17:29:16.390 In main
//2012-07-26 17:29:16.390 In myTimerProc1
//2012-07-26 17:29:16.890 In main
//2012-07-26 17:29:16.890 In myTimerProc1
//2012-07-26 17:29:17.390 In main
//2012-07-26 17:29:17.890 In myTimerProc2
//2012-07-26 17:29:18.390 In main
//2012-07-26 17:29:18.390 In myTimerProc1
//2012-07-26 17:29:18.890 In main
//2012-07-26 17:29:18.890 In myTimerProc1
//2012-07-26 17:29:19.390 In main
//2012-07-26 17:29:19.890 In myTimerProc2
Eddie780 2016-02-24
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
加一个消息循环?
已成功!谢谢赵4老师!!
赵4老师 2016-02-24
  • 打赏
  • 举报
回复
加一个消息循环?
用过最好的换肤控件,使用简单,只要调用一个方法,所有以前打开的,后面打开的窗口都换成想要的皮肤,pb12.5也能使用,不过不能使用pb9版本的,而是pb11版本的,无需注册! SkinSharp是Windows环境下一款强大的通用换肤库。 SkinSharp作为通用换肤库,只需要在您的程序中添加一行代码,就能让您的界面焕然一新,并拥有多种主题风格和色调的动态切换功能以及Aero透明边框特效。 SkinSharp采用独特的软件界面开发技术,让原本复杂繁琐的界面编程变得轻松自如。SkinSharp换肤库目前支持所有流行的开发工具。SkinSharp可以在不修改客户程序的基础上,对在Windows上运行的任何程序进行随意换肤,完全实现了将程序界面与业务逻辑彻底分离,从而可以让您轻松地完成程序界面的完美升级。 SkinSharp优势 SkinSharp与同类产品相比有如下优势: 1. 超轻量级换肤,SkinSharp不依赖于任何第三方类库或模板库(STL,MFC,ATL等),仅仅使用到系统最基本的核心动态链接库。因此体积在同类产品上是最小的,仅不到200K,运行效率也是最高的,所有绘制和操作全部都是基于Win32 API的, 其他同类换肤库则十分臃肿。 2. SkinSharp 在滚动条和菜单换肤上,和其他同类换肤库有着明显的优势。在滚动条换肤上,SkinSharp做到了所有控件内置滚动条的换肤,并且不修改控件任何风格和属性,完美兼容各个控件。在菜单换肤上,SkinSharp采用独特的技术对所有菜单实行换肤,没错,是所有的菜单,包括IE控件内部菜单,系统菜单,滚动条菜单等等,只要是菜单就能换肤!并且支持所有菜单的透明! 3. SkinSharp 采用先进的皮肤格式,完美兼容各种不同形状外观的皮肤制作。SkinSharp皮肤采用超高压缩率,体积超小,最小的皮肤小于10K。载入效率极高,无任何延迟!设计的先进性使得SkinSharp的皮肤有着很好的版本兼容性,即使今后增加了皮肤属性项,也依然能够保持版本的兼容性。 SkinSharp的皮肤同时支持加密功能,保护您自己设计的皮肤不被其他人恶意使用。 4. SkinSharp 可以让你轻松拥有Aero透明边框以及阴影特效!SkinSharp仅用标准的GDI API就实现了Aero特效,并且效率极高! 其他换肤库则没有此特性或者使用了GDI+,这样在Windows 2000等系统中你就必须多带一个GDI+的动态链接库,并且效率会有所影响。另外,SkinSharp还支持边缘阴影,还可以调整阴影参数, 实现超炫效果! 5. SkinSharp 支持更改皮肤的色调,饱和度,亮度,窗体的透明度,菜单的透明度。仅一款皮肤,您就可以拥有不同的色调主题!做出类似QQ色调主题是一件轻而易举的事情! 6. SkinSharp 并非COM组件,仅以标准的动态或静态链接库的形式存在,SkinSharp无需进行系统注册,直接使用! 7. SkinSharp 完全支持Unicode,提供多种编码格式,支持静态库链接,与客户程序可以进行无缝整合!支持绝大多数第三方控件的完美换肤!界面与业务逻辑彻底分离!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧