在托管C++中返回奇怪的GetLastError

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)

asv*_*kau 5

许多功能SetLastError在进行工作时会称为副作用.通常,这意味着函数会调用其他函数,这些函数可能会调用一些内部故障,因此会SetLastError覆盖先前的错误值.

作为一个例子,Log函数调用的东西很可能会调用设置ERROR_INSUFFICIENT_BUFFER,处理错误并返回成功的东西.结果?即使您的代码没有在更大的意义上失败,您的错误值也会被破坏.

当Win32函数失败时,GetLastError在调用太多不相关的代码之前需要注意调用.

更新:我还会阅读评论中的链接.此外,阅读您的代码,其中显示"失败",然后是0错误代码,我认为可能发生的是另一端关闭套接字(即recv返回0).