| 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.
 
 
 |