Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
980to984
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
980to984
980to984
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Problem mit shell

Problem mit shell
25.05.2008 13:38:00
TomTomson
Hallo zusammen,
ich bin noch neu in der VBA Programmierung und hoffe auf Eure Hilfe.
Ich habe ein kleines Modul geschrieben, dass in der Shell ein selbstgeschriebenes C++ Programm (exe) aufruft. Funktioniert auch so weit. Problem ist nur, dass in diesem C++ Programm Daten in eine Datei geschrieben werden sollten, das Programm die Datei aber nicht anlegt...
Das C++ Programm funktioniert 100%ig. Wenn ich es manuell in der Shell aufrufe (oder per Doppelklick), wird die Ausgabedatei erzeugt, außerdem warte ich auch bis das C++ Programm fertig ist (...WaitForSingleObject(proc.hProcess, 0)...)
Ich habe keine Ahnung was ich noch machen kann...
Danke für Eure Hilfe
Tom

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem mit shell
25.05.2008 16:35:00
Ramses
Hallo
Hast du ein Codebeispiel ?
Welche Daten sollen da in welche Datei geschrieben werden ?
Gruss Rainer

AW: Problem mit shell
26.05.2008 06:30:00
TomTomson
Hallo Rainer,
in VBA sieht es in etwa so aus:
Option Explicit
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&
'start
'do something
ExecCmd("C:\da wo die exe ist\Test.exe") '

Public Sub ExecCmd(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim ReturnValue As Integer
' Initialize the STARTUPINFO structure:
start.cb = Len(start)
' Start the shelled application:
ReturnValue = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
' Wait for the shelled application to finish:
Do
ReturnValue = WaitForSingleObject(proc.hProcess, 0)
DoEvents
Loop Until ReturnValue  258
ReturnValue = CloseHandle(proc.hProcess)
End Sub


'ende
und Test.exe:
int main(int argc, const char* argv[])
{
std::ofstream errors("errors.txt"); //open error log filestream
errors" errors.close();
}
Gruss
Tom

Anzeige
AW: Problem mit shell
26.05.2008 07:27:00
Harald
Hallo Tom,
von C++ hab ich kaum Ahnung, aber ich rate mal: Du legts die Datei errors.txtz an und schreibts dort irgend etwas rein. Da das von der Kommandozeiel aus funktioniert, gehe ich davon aus, dass das Programm funktioniert. Da Du in dem C++ Code keinen Pfad für die Datei angibst, legt das Programm die Datei vermutlich im gerade aktiven Verzeichnis ab (Arbeitsverzeichnis).
Vermutlich tut sie das auch korrekt beim Aufruf mitels shell() aus Excel heraus. Nur weist Du womöglich dann nicht, was das Arbeitsverzeichnis ist.
Tip 1: suche nach dem Excel-Aufruf mal auf der ganzen Festplatte nach der Datei "errors.txt". Sie liegt möglicherweise unter "eigene Dokumente" oder auf "c:\" oder "c:\temp" oder ...
Tip 2: verwende einen vollständigen Pfadnamen, also "c:\temp\errors.txt" statt nur des Dateinamens
Tip 3: Übergebe den Pfadnamen beim Aufruf aus Excel als Parameter. also etwa "ExecCmd("C:\da wo die exe ist\Test.exe C:\da wo das Ergebnis hinsoll\errors.txt")
Natürlich muss dann in den C++ Code statt der fest codierten Ausgabedatei der Parameter, irgendwie so:
statt
std::ofstream errors("errors.txt"); //open error log filestream
std::ofstream errors(argv[1]); //open error log filestream
Selbstverständlich mit vorheriger Prüfung, ob argv[1] überhaupt existiert und ein gültiger Pfa ist, aber das weißt Du als C++ Programmierer eh.
Gruß Harald

Anzeige
AW: Problem mit shell
26.05.2008 13:01:17
TomTomson
Danke Harald, so einfach ist es manchmal!
da hätte ich auch selbst drauf kommen können...
manchmal sieht man den Wald vor lauter Bäumen nicht....
und ich wollte mich schon wieder über Bill Gates beschweren...

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige