Jetzt hab ich immerhin soviel herausgefunden, dass wenn man den VB Code wieder nach C/C++ umschreibt funzt es:#include <windows.h>
#include <iostream>
#ifdef _CONSOLE
int main(int /*argc*/, char * /*argv[]*/ /*, char *env[]*/)
#else
int APIENTRY WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, _
LPSTR /*lpCmdLine*/, int /*nCmdShow*/)
#endif
{
HANDLE hReadPipe1; // STDOUT
HANDLE hWritePipe1; // STDOUT
HANDLE hReadPipe2; // STDERR
HANDLE hWritePipe2; // STDERR
HANDLE hReadPipe3; // STDIN
HANDLE hWritePipe3; // STDIN
DWORD bytewritten;
char cmdline[256];
char StuffToWrite[256];
STARTUPINFO start;
PROCESS_INFORMATION proc;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
// A pipe of redirection of STDOUT
if(!CreatePipe(&hReadPipe1, &hWritePipe1, &sa, NULL))
{
std::cerr << "CreatePipe failed!\n";
}
// A pipe of redirection of STDERR
if(!CreatePipe(&hReadPipe2, &hWritePipe2, &sa, NULL))
{
std::cerr << "CreatePipe failed!\n";
}
// A pipe of redirection of STDIN
if(!CreatePipe(&hReadPipe3, &hWritePipe3, &sa, NULL))
{
std::cerr << "CreatePipe failed!\n";
}
memset(&start, 0, sizeof(start));
memset(&proc, 0, sizeof(proc));
start.cb = sizeof(start);
start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
start.hStdOutput = hWritePipe1;
start.hStdError = hWritePipe2;
start.hStdInput = hReadPipe3;
start.wShowWindow = SW_NORMAL; // SW_HIDE
strcpy(cmdline, "cmd");
if(!CreateProcess(NULL, cmdline, &sa, &sa, TRUE, NORMAL_PRIORITY_CLASS, NULL, _
NULL, &start, &proc))
{
std::cerr << "CreateProcess failed!\n";
}
CloseHandle(hWritePipe1);
CloseHandle(hWritePipe2);
CloseHandle(hReadPipe3);
strcpy(StuffToWrite, "start notepad\n");
if(!WriteFile(hWritePipe3, &StuffToWrite, (DWORD) strlen(StuffToWrite), _
&bytewritten, NULL))
{
std::cerr << "WriteFile failed!\n";
}
strcpy(StuffToWrite, "exit\n");
if(!WriteFile(hWritePipe3, &StuffToWrite, (DWORD) strlen(StuffToWrite), _
&bytewritten, NULL))
{
std::cerr << "WriteFile failed!\n";
}
/*while(WaitForSingleObject(proc.hProcess, 10) == WAIT_TIMEOUT)
{};*/
CloseHandle(hReadPipe1);
CloseHandle(hReadPipe2);
CloseHandle(hWritePipe3);
} Vielleicht ist ja mit den API Deklarationen noch etwas faul. Ansonsten fällt mir jetzt spontan auch nix mehr ein. Eine Lösung gibt es aber dann auf jeden Fall, diesen Code in eine C/C++ - DLL auslagern und dann von VB aus aufrufen. Immerhin schonmal eine Lösung, wenn auch eher quick & dirty . |