我最近一直在尝试使用C++中的Windows API创建一个窗口类.但是,每当我尝试调用ShowWindow时,该函数都会将最后一个错误设置为1400(ERROR_INVALID_WINDOW_HANDLE).在尝试了一段时间之后,我偶然发现了以下示例:http: //blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx#comments
即使创建一个新项目(我使用MSVC Express 2008)并完全复制代码(我讨厌做),我发现,当代码成功创建一个窗口时,ShowWindow函数仍然报告错误1400.这是摘录自在上面的链接中找到的代码:
int PASCAL
WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int nShowCmd)
{
 g_hinst = hinst;
 if (SUCCEEDED(CoInitialize(NULL))) {
  InitCommonControls();
  RootWindow *prw = RootWindow::Create();
  if (prw) {
   ShowWindow(prw->GetHWND(), nShowCmd);
   int error = GetLastError(); //Line added by me, error gets set to 1400.
   MSG msg;
       while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
  }
  CoUninitialize();
 }
 return 0;
}
(完整代码可以在上面的链接中找到)
如果有人对如何将窗口句柄作为类的成员变量有任何想法而没有在ShowWindow上收到错误1400,我将非常感谢一些帮助.
我正在尝试编写一个程序,该程序从当前目录中的 MinGW 发行版执行 make.exe 并利用其 STDOUT 数据和退出代码。我有一个处理 STDOUT 的句柄,我从中获取数据,用 CreatePipe 创建。当我在该管道上收到 ERROR_HANDLE_EOF 时,我认为该进程已退出并尝试获取其退出代码:
if(session->pid == 0) return;
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION |
            PROCESS_TERMINATE, TRUE, session->pid);
if(hp == NULL) {
    printf("OpenProcess(%i) failed, error: %i\n",
        session->pid, (int)GetLastError());
    return;
}
我的代码适用于我测试的所有其他 MinGW 实用程序(如 pwd、ls 等),我可以毫无问题地获得 STDOUT 和退出代码。但是当我在 make 上尝试时,上面的代码显示以下消息:
“OpenProcess(2032) 失败,错误:87”
我用谷歌搜索错误代码 87,它说“无效参数”。我不明白像 2032 这样的积极进程 ID 有什么可能无效。有什么想法吗?
我正在调用该函数EnumProcessModulesEx,但它失败了。我在 64 位机器上运行。这是下面的代码:
wchar_t* dest = new wchar_t[100];
int index = SendMessage(processes, LB_GETCURSEL, 0, 0);
SendMessage(processes, LB_GETTEXT, index, (LPARAM)dest);
HMODULE module;
unsigned long cbneeded;
EnableTokenPrivilege(hWnd, SE_DEBUG_NAME);
HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, _wtoi(dest));
int errorcode = GetLastError();
BOOL ret = EnumProcessModulesEx(h, &module, sizeof module, &cbneeded, LIST_MODULES_ALL);
int err = GetLastError();
wchar_t* name = new wchar_t[MAX_PATH];
GetModuleBaseName(h, module, name, sizeof name);
MessageBox(hWnd, name, L"Process Name", 0);
delete dest;
delete name;
我对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;
   }
托管代码:
  void SendManagedMessage(String ^ strMessage)
  {
    CString cstrMessage = (char*) Marshal::StringToHGlobalAnsi(strMessage).ToPointer();
    CString cstrResponse;
       if …最小的例子:
#include <Windows.h>
#include <string>
int main(int /*argc*/, char* /*argv*/[]) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //Behavior the same, with or without.
    DWORD err = GetLastError();
    std::string str;
    return (int)err; //returns 127 iff line above uncommented, 0 iff commented
}
此程序返回127,对应于ERROR_PROC_NOT_FOUND("无法找到指定的过程.").请注意,err设置之前的std::string创建.该程序使用MSVC 2017以调试模式编译.
这种行为有望吗?如果没有,我可以得到一些确认(然后,我会提交错误报告)吗?
我正在使用 I/O-Completion Port 编写一个小的服务器-客户端的东西。
我通过我的完成端口通过 AcceptEx 成功连接了服务器和客户端。客户端连接后,客户端套接字与完成端口相关联,并在该套接字上调用对 WSARecv 的重叠调用。
一切正常,直到我关闭客户端测试程序。
GetQueuedCompletionStatus()退货FALSE和GetLastError退货
ERROR_NETNAME_DELETED
,这对我来说很有意义(在我阅读了 MSDN 上的描述之后)。
但我的问题是,我认为调用GetQueuedCompletionStatus会返回一个数据包,表明由于套接字关闭而失败,因为WSARecv会返回适当的返回值。由于情况并非如此,我不知道哪个客户端的套接字导致了错误并且无法按照我需要的方式行事(释放结构,清理此特定连接等)...
关于如何解决这个问题的任何建议或提示?
谢谢:)
编辑:http : //codepad.org/WeYINasO <- 负责的代码......“错误”发生在 while 循环的第一个函数开始处(对它的调用GetCompletionStatus()只是 GetQueuedCompletionStatus() 工作正常的包装器其他情况)[确实把它贴在那里,因为它在这里看起来又脏又乱]
我想知道在 Classic ASP 中,Server.GetLastError 函数返回了什么样的对象。
如果这是一个 .net 或 JavaScript 函数,我会简单地附加一个调试器并查看返回的内容,但我没有任何工具可以在我工作的环境中使用经典 ASP 代码执行此操作。
GetLastError()可以某种方式传递给FormatMessageW格式化的消息.目标是最终得到一个QString.这样做的正确和安全的方法是什么?
当我在没有运行时包的情况下执行此代码时,出现 32 代码错误,这是正确的。但是当我激活运行时包(例如仅使用“FireDACASADriver;YmagControlDB”)时,错误代码始终为“0”
procedure TForm1.Button1Click(Sender: TObject);
Var
   Stream: TStream;
   iError : integer;
begin
   Stream := nil;
   iError := -1;
   try
      try
         Stream := TFileStream.Create('d:\toto.docx', fmOpenRead);
      except
         begin
            iError := GetLastError;
         end;
      end;
   finally
      if Assigned(Stream) then
         Stream.Free;
   end;
   showmessage('Erreur : ' + inttostr(iError));
end;
如何使用运行时包修复 GetLastError?
getlasterror ×9
winapi ×6
c++ ×4
windows ×2
64-bit ×1
asp-classic ×1
c# ×1
debugging ×1
delphi ×1
delphi-xe6 ×1
makefile ×1
openprocess ×1
qt ×1
qtcore ×1
showwindow ×1
string ×1
windows-7 ×1
winsock ×1