【问题标题】:AfxGetInstanceHandle() triggers an assertion failureAfxGetInstanceHandle() 触发断言失败
【发布时间】:2011-07-07 02:33:50
【问题描述】:

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

这个函数触发断点:

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

ASSERT 语句失败。在我们尝试访问 afxCurrentInstanceHandle 之前,是否需要做一些特别的事情来初始化它?

PS:我在共享 dll 中使用 MFC。

编辑

我的代码是这样的:

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

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

我想使用InstanceHandle 来初始化CComModule,然后用它来操作com 对象。

【问题讨论】:

    标签: c++ visual-studio com mfc


    【解决方案1】:

    我用 MFC 制作了一个控制台应用程序,也收到了消息。我找到了解决方案,您需要在 main(_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.
        ...
    

    【讨论】:

    • 我有同样的问题,我想知道:不应该调用AfxInitExtensionModule(...)初始化MFC吗?调用AfxGetInstanceHandle() 时仍然出错。如果我添加˙AfxWinInit(...) 错误就消失了。
    【解决方案2】:

    用途:

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    

    打电话之前:

    AfxGetInstanceHandle();
    

    【讨论】:

    • 这并不能解决我的问题。但 user2528794 的答案有效。
    【解决方案3】:

    如果您为 DLL/应用程序混合 unicode/mbcs 或调试/发布构建模式,就会发生这种情况。

    【讨论】:

    • 我的项目及其所有依赖项正在使用共享 DLL 中的 MFC、多线程调试 DLL 和多字节字符进行编译。可能是其他原因
    【解决方案4】:

    如果您使用 MFC,则不应提供 main、wmain、_tmain 或 WinMain——MFC 提供了自己的入口点。将初始化代码放在 CWinApp 派生类的 InitInstance 中。如果您没有 CWinApp 派生类,则说明您没有正确创建项目 - 使用 Visual Studio 向导创建 MFC 应用程序。

    【讨论】:

    • 那么没有所有 CWinApp 对象就没有办法访问 AfxGetInstanceHandle() 吗?
    • 我认为我做错了什么,我并不真的需要这个来使用 COM 对象。谢谢。
    • 投反对票,因为这不是真的。对于 Window/GUI 应用程序,您的说法是正确的,项目向导将创建一个 CWinApp 派生类。但是,当您创建支持 MFC 的控制台应用程序时,会创建带有 main (_tmain) 函数的源代码,并首先调用 AfxWinInit 来设置 MFC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2020-05-18
    • 2011-05-27
    • 1970-01-01
    • 2017-12-09
    • 2021-03-16
    相关资源
    最近更新 更多