CreatePipe и необходимые полномочия в C#

Я пытаюсь добавить решатель Sokoban (записанный в C++) к моей программе в C# (у меня есть класс в моей программе, которая обрабатывает маршалинг интерфейса C++). Моя библиотека solver.dll загрузок программы, которая загружает solver.exe. 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 (для каналов)?

Спасибо!

1
задан Martin Vseticka 17 July 2010 в 12:57
поделиться

1 ответ

Фу, это ужасно. Это может работать только в том случае, если MyProgram.exe является приложением консольного режима. Требуется для работы перенаправления ввода / вывода. Вероятно, это работает в отладчике из-за процесса хостинга Visual Studio.

P / Вызов AllocConsole в вашей программе решит проблему. Я предполагаю, что вам не особенно важно это окно консоли, вам придется переписать этот интерфейс. Использование именованных каналов решило бы эту проблему. На самом деле нет смысла запускать решатель как отдельный процесс. Взгляните на C ++ / CLI, чтобы продвинуться вперед.

2
ответ дан 2 September 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: