0

我在 VS2010 C++ 中工作,并且我对 FormatMessage() 进行了 C++/CLI 调用,该调用引发了一个奇怪的异常。这是下面的代码块。

if((m_hglrc = wglCreateContext(m_hDC)) == NULL)
{
    MessageBox::Show("wglCreateContext Failed");

    char* lpBuffer;

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, // It´s a system error
        NULL,                                     // No string to be formatted needed
        ::GetLastError(),                         // Hey Windows: Please explain this error!
        MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), // Do it in the standard language
        (LPTSTR)&lpBuffer,                        // Put the message here
        0,                                        // Number of bytes to store the message
        NULL);

    MessageBox::Show( nullptr, gcnew System::String(lpBuffer), "LastRrror",MessageBoxButtons::OK);
    //MessageBoxW(NULL,(LPCTSTR)lpBuffer, _T("LastRrror"),MB_OK|MB_ICONWARNING);    

    // Free the buffer.
    if(lpBuffer)LocalFree(lpBuffer);

    return 0;
}

出现消息框“wglCreateContext Failed”后,我在运行时收到以下错误。

An unhandled exception of type 'System.Runtime.InteropServices.MarshalDirectiveException' occurred in Spritey.exe  
Additional information: Cannot marshal 'parameter #7': Pointers cannot reference marshaled structures.  Use ByRef instead.

参数 #7 似乎有问题,在我的情况下为 NULL。参数 #7 (就msdn解释而言)是可选的,并且需要一个 valist* 用于插入到格式字符串中。现在我没有使用这个参数,因此输入了 NULL。

我在论坛和网上看到其他人遇到过这个问题,他们的问题已经通过在项目配置中将使用的 clr 支持版本从 \clr:pure 切换到常规 \clr 来解决。为什么这会有所作为?

这也对我不起作用。任何人都可以看到我在使用 FormatMessage() 时做错了什么吗?

在此先感谢,
盖伊

4

0 回答 0