【问题标题】:CreatePipe and necessary permissions in C#C# 中的 CreatePipe 和必要权限
【发布时间】:2010-07-17 12:57:12
【问题描述】:

我正在尝试将 Sokoban 求解器(用 C++ 编写)添加到我的 C# 程序中(我的程序中有一个类来处理 C++ 接口的编组)。我的程序加载了加载solver.exe 的solver.dll 库。 Solver.dll 和 Solver.exe 通过管道进行通信。

问题是,当我在 Visual Studio(调试)中运行我的程序时,DLL 已正常加载,并且插件的功能运行良好。但是,当我在 Visual Studio 之外打开我的程序(只需双击 MyProgram.exe)并尝试运行求解函数时,会出现错误消息:“管道无效”和“创建管道失败”。出现。

我很茫然可能是什么问题,但我猜是某些权限有问题。

这是插件作者的两部分代码:

在solver.dll文件中:

 //create pipes
 SECURITY_ATTRIBUTES attr;
 attr.nLength=sizeof(attr);
 attr.lpSecurityDescriptor=NULL;
 attr.bInheritHandle=TRUE;
 if(!CreatePipe(&hPipeOutRead,&hPipeOutWrite,&attr,0)
         ||!CreatePipe(&hPipeInRead,&hPipeInWrite,&attr,0) )
 {
         ReportError("Failed to create pipe.");
         return SOKOBAN_PLUGIN_RESULT_FAILURE;
 }

 //set std handle for deliver pipe
 HANDLE hStdInSave, hStdOutSave;
 hStdInSave=GetStdHandle(STD_INPUT_HANDLE);
 hStdOutSave=GetStdHandle(STD_OUTPUT_HANDLE);
 if(hStdInSave==INVALID_HANDLE_VALUE || hStdOutSave==INVALID_HANDLE_VALUE)
 {
         ReportError("Failed to get std handles.");
         return SOKOBAN_PLUGIN_RESULT_FAILURE;
 }
 if(!SetStdHandle(STD_INPUT_HANDLE,hPipeOutRead)
         ||!SetStdHandle(STD_OUTPUT_HANDLE,hPipeInWrite) )
 {
         ReportError("Failed to redirect std handles.");
         return SOKOBAN_PLUGIN_RESULT_FAILURE;
 }

 //create BoxSearch Process
 STARTUPINFO startInfo;
 ZeroMemory(&startInfo,sizeof(startInfo));
 startInfo.cb=sizeof(startInfo);

 PROCESS_INFORMATION processInfo;
 ZeroMemory(&processInfo,sizeof(processInfo));

 char dllDir[MAX_PATH];
 char exeName[MAX_PATH+100];
 GetModuleFileName(ghinstDLL,dllDir,MAX_PATH);
 *(strrchr(dllDir,'\\')+1)=0;
 strcpy(exeName,dllDir);
 strcat(exeName,"Solver.exe");

 char cmdLine[MAX_PATH+100];
 strcpy(cmdLine,"\"");
 strcat(cmdLine,exeName);
 strcat(cmdLine,"\"");
 strcat(cmdLine," ");
 strcat(cmdLine,API_DLLCommandLine);

 BOOL launchSuccess=CreateProcess(exeName,cmdLine,NULL,NULL,TRUE,0,NULL,dllDir,&startInfo,&processInfo);

在 Solver.exe 旁边:

//get pipes
 hPipeRead=GetStdHandle(STD_INPUT_HANDLE),
 hPipeWrite=GetStdHandle(STD_OUTPUT_HANDLE);
 if(0==hPipeRead || INVALID_HANDLE_VALUE==hPipeRead
         ||0==hPipeWrite|| INVALID_HANDLE_VALUE==hPipeWrite)
 {
         FormattedMessageBox("Got invalid pipe.");
         return;
 }

可能是什么问题?是否有与加载的 DLL 相关的权限(用于管道)?

谢谢!

【问题讨论】:

    标签: c# c++ pipe


    【解决方案1】:

    哎呀,太丑了。这只有在 MyProgram.exe 是控制台模式应用程序时才能正常工作。需要使输入/输出重定向工作。由于 Visual Studio 托管过程,它可能在调试器中工作。

    P/在你的程序中调用 AllocConsole 可以解决这个问题。我猜你并不特别关心那个控制台窗口,你必须重写那个界面。使用命名管道可以解决它。实际上,将求解器作为单独的进程运行没有任何意义。看看 C++/CLI 以获得成功。

    【讨论】:

    • 感谢您的回复!我不是插件的作者,我无法以任何方式更改它。 MyProgram.exe 不幸的是 WPF 应用程序。有没有办法解决它? pinvoke.net/default.aspx/kernel32.allocconsole - 我由此得知 AllocConsole 不能在 WPF 中使用。
    • (我今天的票已经用完了。明天我会为你投票)
    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2012-09-26
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多