下面的代码是一个Dll中的,我想在 程序用调用 OpenIndex 函数来显示这个Dll中的窗口,窗口在调用的时候一闪就过去了,刚才在网上查,好象是和消息循环有问题,怎样才可以和WinMain中的消息循环连接上呢?或者是自己写一个同样功能的消息循环?
class MyApp:public CWinApp
{
public:
MyApp():CWinApp("Index.dll") {}
BOOL InitInstance()
{
CFrameWnd *Index=new IndexFrame;
m_pMainWnd=Index;
return TRUE;
}
};
//入口函数
extern "C" _declspec(dllexport) BOOL OpenIndex()
{
MyApp theWnd; theWnd.InitInstance(); return TRUE;
}

解决方案 »

  1.   

    汗...
    没见过这样显示窗体的.别的不说OpenIndex()调用完成之后 MyApp theWnd 要销毁, 窗体早就不存在了还怎么显示?用不着消息循环,你在你自己的程序中来关闭这个DLL里的窗体就行了.
      

  2.   

    楼上的可能理解错了,程序应该是执行到 theWnd.InitInstance(); 这里,显示窗口.在MFC程序中会在生成Exe的时候和WinMain关联起来,WinMain里面应该有处理消息之类的函数,因为我现在写的是一个Dll,生成Dll的时候没有和WinMain连接起来,我现在想找一种可以方法可以代替WinMain的功能,或使用WinMain函数.
    现在是没有消息循环,该如何处理呢?
    都怪我在浮沙筑台呀,突击 MFC深入浅出 中.望高手能帮一下.
      

  3.   

    对,浮沙筑不起高台。你要显示窗口,为什么用CWinApp类呢?从CWnd继承不就可以了吗?
      

  4.   

    不好意思 我代码没有写全  
    这是一个Dll,功能是通过调用OpenIndex函数 可以打开一个窗口,一个可以正常使用的窗口.
    现在的代码也可以打开,但是一闪就没有了.
    IndexFrame.hclass IndexFrame:public CFrameWnd
    {
    public:
    IndexFrame();
    IndexFrame(DataLogin EnterData);
    BOOL OnCreate(LPCREATESTRUCT lpCreateStruct);
    public:
    //窗口操作响应
    public:
    //当前类局部变量
    DataLogin Password;
    CString Title; DECLARE_MESSAGE_MAP()
    };
    class MyApp:public CWinApp
    {
    public:
    MyApp():CWinApp("Index.dll") {}
    BOOL InitInstance();
    void SetDataLogin(DataLogin);
    DataLogin Password;
    };
    extern "C" _declspec(dllexport) BOOL OpenIndex(DataLogin EnterData);
    [code]
    [code=C/C++]
    Index.Cpp#include"stdafx.h"
    #include"IndexFrame.h"
    BEGIN_MESSAGE_MAP(IndexFrame,CFrameWnd) ON_WM_CREATE()
    END_MESSAGE_MAP()
    IndexFrame::IndexFrame()
    {}IndexFrame::IndexFrame(DataLogin EnterData)
    {
    Password=EnterData;
    Title="读取网站接口";
    Create(NULL,Title,WS_VISIBLE|WS_OVERLAPPEDWINDOW|WS_MAXIMIZE);//建立主窗口,所有建立在这个窗口里的控件,都要在这条语句之后}BOOL IndexFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    return TRUE;
    }BOOL MyApp::InitInstance()
    {
    CFrameWnd *Index=new IndexFrame(Password);
    m_pMainWnd=Index;
    return TRUE;
    }void MyApp::SetDataLogin(DataLogin a)
    {
    Password=a;
    }//入口函数
    BOOL OpenIndex(DataLogin EnterData)
    {
    MyApp theWnd;
    MSG msg; theWnd.SetDataLogin(EnterData);
    theWnd.InitInstance();
    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    } return TRUE;
    }
      

  5.   

    1.没有Create窗口 ;
    2.InitInstance创建非模态对话框应该返回FALSE;
    3.MyApp theWnd 应该定义为全局的;
    4.没看过自己调用InitInstance()的
      

  6.   

    MyApp    theWnd;是个局部变量,出了OpenIndex之后,theWnd就不存在了.
    试试把theWnd改为全局或是静态变量.
      

  7.   

    你要显示窗口,可以用MFC的对话框或者自己注册类,用CreateWindow、ShowWindow来显示,再执行完显示后加个消息循环,不是构造CWinApp类。
      

  8.   

    看了 整个 代码 建议你 直接 创建一个Thread 让窗口在这个Thread里面创建 处理消息吧这样 还比较 容易 处理;以你现在对MFC这快的了解程度,这种方法是最快截,不然就算窗口创建出来了,和Exe中的MainThread 当中的消息循环共用的话,你也同样会遇到另外一问题,就是 模块资源的切换问题很麻烦的
      

  9.   

    我把theWnd定义为全局变量,可能是因为没有消息循环,窗口没有任何响应,一会就自己关了.
    把OpenIndex中的窗口定义为非模式对话框,但是打开多个相同的对话框后,消息乱了.谢谢楼上几位的回答,问题的根本是我对MFC不够了解,我现在正在读深入浅出MFC,书确实不错.