C# C中的CreatePipe和必要权限# 我试图在C++中添加一个SokBooBover(C++编写)到我的程序中(我的程序中有一个类,用来处理C++接口的编组)。我的程序加载solver.dll库,该库加载solver.exe。Solver.dll和Solver.exe通过管道进行通信

C# C中的CreatePipe和必要权限# 我试图在C++中添加一个SokBooBover(C++编写)到我的程序中(我的程序中有一个类,用来处理C++接口的编组)。我的程序加载solver.dll库,该库加载solver.exe。Solver.dll和Solver.exe通过管道进行通信,c#,c++,pipe,C#,C++,Pipe,问题是,当我在VisualStudio中运行我的程序(调试)时,DLL加载正常,插件的功能运行良好。但当我在Visual Studio之外打开程序(只需双击MyProgram.exe)并尝试运行解决函数时,会出现错误消息:“获取无效管道”和“未能创建管道” 我完全不知道可能是什么问题,但我猜有些权限有问题 以下是插件作者的两部分代码: 在solver.dll文件中: //create pipes SECURITY_ATTRIBUTES attr; attr.nLength=sizeof(a

问题是,当我在VisualStudio中运行我的程序(调试)时,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(管道)相关的权限


谢谢

哎呀,真恶心。只有当MyProgram.exe是控制台模式应用程序时,此功能才能正常工作。需要使输入/输出重定向正常工作。由于VisualStudio宿主进程,它可能在调试器中工作


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

感谢您的回复!我不是插件的作者,我不能以任何方式改变它。不幸的是,MyProgram.exe是WPF应用程序。有没有办法解决这个问题我由此得出结论,AllocConsole不能在WPF中使用。(我今天的票数已经用完了。明天我将向上投票)