On Tue, 15 May 2001 15:40:02 +0200, "Claus Holm"
<clh@ccieuropeREMOVE.com> wrote:
>Jeg skal lave et kald fra VB til et eksternt program. Dette program
>returnerer en streng afhængig af de parametre, programmet kaldes med.
>
>Jeg troede, at jeg kunne bruge shell, men den returnerer kun task id, hvis
>det gik godt og nul, hvis det gik skidt.
>
>Spørgsmålet er kort og godt, hvordan jeg får tekststrengen returneret til en
>variabel, som jeg kan arbejde videre med?
Du skal lege lidt med API.
Jeg har en C kode (ren Windows API), der klarer problemet (sorry, jeg
er ikke inde i VB).
Hvis nogen skulle føle sig generet af mine C-kommentarer, så sig til.
Der er jo blot det at API stort set er det samme i C som i VB eller
Delphi.
<snip>
DWORD dwBytesRead;
HANDLE hErrorWrite, hInputRead, hInputWrite, hInputWriteTmp,
hOutputRead, hOutputReadTmp, hOutputWrite;
LONG nBytesToRead;
PBYTE pBuffer;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CreatePipe (hOutputReadTmp, hOutputWrite, &sa, 0);
DuplicateHandle (GetCurrentProcess (), hOutputWrite, GetCurrentProcess
(), &hErrorWrite, 0, TRUE, DUPLICATE_SAME_ACCESS);
CreatePipe (hInputRead, hInputWriteTmp, &sa, 0);
DuplicateHandle(GetCurrentProcess (), hOutputReadTmp,
GetCurrentProcess (), &hOutputRead, 0, FALSE, DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess (), hInputWriteTmp,
GetCurrentProcess (), &hInputWrite, 0, FALSE, DUPLICATE_SAME_ACCESS);
CloseHandle (hOutputReadTmp);
CloseHandle (hInputWriteTmp);
ZeroMemory (&si, sizeof (STARTUPINFO));
si.cb = sizeof (STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdInput = hInputRead;
si.hStdOutput = hOutputWrite;
si.hStdError = hErrorWrite;
si.wShowWindow = SW_HIDE;
CreateProcess (NULL, "program.exe --parameter", &sa, &sa, TRUE, 0,
NULL, NULL, &si, &pi);
CloseHandle (hOutputWrite);
CloseHandle (hInputRead);
CloseHandle (hErrorWrite);
nBytesToRead = GetFileSize (hOutputRead, NULL);
pBuffer = (PBYTE) HeapAlloc (GetProcessHeap (), 0, nBytesToRead + 2);
ReadFile (hOutputRead, pBuffer, nBytesToRead, &dwBytesRead, NULL);
pBuffer[dwBytesRead] = '\0';
HeapFree (GetProcessHeap (), 0, pBuffer);
</snip>
'pBuffer' indeholder nu outputtet fra det kørte program, og kan sættes
ind i en EDIT kontrol eller andet steds.
kh
Chris Hansen
P.S. Hvis du ikke er inde i C, så kan nogle andre her i gruppen måske
hjælpe med at oversætte koden til VB.
|