- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将推箱子求解器(用 C++ 编写)添加到我的 C# 程序中(我的程序中有一个类可以处理 C++ 接口(interface)的编码)。我的程序加载了加载 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(用于管道)相关的权限?
谢谢!
最佳答案
哎呀,这太糟糕了。这只有在 MyProgram.exe 是控制台模式应用程序时才能正常工作。需要使输入/输出重定向工作。由于 Visual Studio 托管进程,它可能在调试器中工作。
P/在你的程序中调用 AllocConsole 会解决这个问题。我猜你不会特别在意那个控制台窗口,你必须重写那个界面。使用命名管道可以解决它。实际上,将求解器作为单独的进程运行没有任何意义。查看 C++/CLI 以获得领先。
关于c# - C# 中的 CreatePipe 和必要的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271555/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!