Ada*_*oll 1 c# c++ winapi getlasterror
我对GetLastError和托管C++有一个非常奇怪的问题.从非托管代码转换为托管代码后,GetLastError返回一些非常奇怪的东西.
错误代码:122 - 传递给系统调用的数据区域太小.
另外,传入的strMessage正在向服务器发送它.
非托管功能:
DWORD SendMessage(LPCTSTR strMessage, CString * strResponse)
{
DWORD dwLastError;
BOOL bSuccess = FALSE;
try
{
//some socket code
int ret = recv...
if (ret == SOCKET_ERROR || ret == 0)
{
Log(GetLastError()); //falls into here
Log(WSAGetLastError());
throw "Failed!"
}
bSuccess = TRUE;
}
catch (LPCTSTR pszException)
{
dwLastError = GetLastError();
Log(pszException);
Log(dwLastError );
Log(WSAGetLastError());
}
Log(dwLastError);
SetLastError(dwLastError);
return bSuccess;
}
Run Code Online (Sandbox Code Playgroud)
托管代码:
void SendManagedMessage(String ^ strMessage)
{
CString cstrMessage = (char*) Marshal::StringToHGlobalAnsi(strMessage).ToPointer();
CString cstrResponse;
if (!SendMessage(cstrMessage, &cstrResponse))
{
Log("Failed to send managed message");
Log(GetLastError());
}
//...
}
Run Code Online (Sandbox Code Playgroud)
记录输出
0
0
Failed!
Failed!
0
0
0
Failed to send managed message
122
Run Code Online (Sandbox Code Playgroud)
许多功能SetLastError在进行工作时会称为副作用.通常,这意味着函数会调用其他函数,这些函数可能会调用一些内部故障,因此会SetLastError覆盖先前的错误值.
作为一个例子,Log函数调用的东西很可能会调用设置ERROR_INSUFFICIENT_BUFFER,处理错误并返回成功的东西.结果?即使您的代码没有在更大的意义上失败,您的错误值也会被破坏.
当Win32函数失败时,GetLastError在调用太多不相关的代码之前需要注意调用.
更新:我还会阅读评论中的链接.此外,阅读您的代码,其中显示"失败",然后是0错误代码,我认为可能发生的是另一端关闭套接字(即recv返回0).
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |