2011-03-02 152 views
9

我在我的C++程序(使用Visual Studio 2008)中使用MFC。我必须在我的程序开始时调用AfxGetInstanceHandle()。AfxGetInstanceHandle()触发断言失败

该功能会触发一个破发点:

AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle() 
{ ASSERT(afxCurrentInstanceHandle != NULL); 
return afxCurrentInstanceHandle; } 

断言语句失败。我想知道在我们尝试访问它之前,您是否需要执行以初始化afxCurrentInstanceHandle

PS:我在共享的DLL中使用MFC。

编辑

我的代码是这样的:

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    CoInitialize(NULL); 
    AfxGetInstanceHandle(); 
    return 0; 
} 

我想,以初始化CComModule,然后用它来操纵COM对象使用InstanceHandle

回答

2

如果您正在使用MFC你不应该提供主,wmain,_tmain,或WinMain函数 - MFC提供了自己的切入点。将初始化代码放入CWinApp派生类的InitInstance中。如果您没有CWinApp派生类,您尚未正确创建项目 - 请使用Visual Studio向导创建MFC应用程序。

+0

因此,如果没有全部的CWinApp对象,就没有办法访问AfxGetInstanceHandle() – Arthur 2011-03-02 12:52:40

+0

我觉得我做错了什么,而我并不真的需要使用COM对象。谢谢。 – Arthur 2011-03-03 15:56:54

+2

Downvote,因为这是不正确的。对于Window/GUI应用程序,您的声明是正确的,项目wizzard将创建一个CWinApp派生类。但是,当您使用MFC支持创建控制台应用程序时,将创建带有main(_tmain)函数的源代码,并首先调用AfxWinInit来设置MFC。 – 2013-06-28 11:48:50

5

,如果你对DLL /应用混合的Unicode/MBCS或调试/发布构建模式会发生这种情况。

+0

我的项目和它的所有依赖关系正在使用MFC在一个共享的DLL,使用MultiThreaded Debug DLL和使用多字节字符。这可能是由于别的东西 – Arthur 2011-03-02 09:03:03

+0

这解决了我的问题。 – 2011-07-28 19:31:16

6

用途:

AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

在打电话:

AfxGetInstanceHandle(); 
7

我做了一个控制台应用程序与MFC和得到的消息了。我找到了解决方案,你需要在主要(_tmain等)开头的“序言”。

int main(int args, char* argv[]) //, char *envp[]) 
{ 
    // initialize MFC and print and error on failure 
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) 
    {  
     // TODO: change error code to suit your needs  
     cerr << _T("Fatal Error: MFC initialization failed") << endl;  
     return 1; 
    } 
    AfxGetInstanceHandle(); 
    // TODO: code your application's behavior here. 
    ...