比如,我要用regsvr32.exe注册某个程序或dll。命令行执行时会得到windows给的通知(以twain_32.dll为例):“twain_32.dll was loaded, but the DllRegisterServer entry point was not found.\n\nDllRegisterServer may not be exported, or a corrupt version of twain_32.dll may be in memory. Consider using PView to detect and Remove it.”。
现在我希望得到这个通知字符串,有什么办法吗?

解决方案 »

  1.   

    #define EXECDOSCMD "ping www.sohu.com" //可以换成你的命令
    BOOL ExecDosCmd()
    {
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead,hWrite;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;
    if (!CreatePipe(&hRead,&hWrite,&sa,0)) 
    {
    return FALSE;


    STARTUPINFO si;
    PROCESS_INFORMATION pi; 
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si); 
    si.hStdError = hWrite;
    si.hStdOutput = hWrite;
    si.wShowWindow = SW_HIDE;
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
             //关键步骤,CreateProcess函数参数意义请查阅MSDN
    if (!CreateProcess(NULL, EXECDOSCMD
    ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) 
    {
    return FALSE;
    }
    CloseHandle(hWrite);

    char buffer[4096] = {0};
    DWORD bytesRead; 
    while (true) 
    {
    if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
    break;
    //buffer中就是执行的结果,可以保存到文本,也可以直接输出
                      printf(buffer);
    Sleep(200); 

             return TRUE;
    }
      

  2.   

    bohut(伯虎):你的方法读取的是控制台中的反馈信息,不是windows的弹出窗口式的通知。我试了,没什么用。
      

  3.   

    vcleaner(我没做大哥已经很久了.......):GetLastError()获取的是本线程内的Error Code,而我得控制台命令是要创建新线程执行的用的是WinExec()或CreateProcess()。GetLastError()不行啊。