我在 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() 时做错了什么吗?
在此先感谢,
盖伊