[vb] CreateProcess maar dan met argumenten

Pagina: 1
Acties:

  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Ik wil een soort shell maken voor nerocmd.exe (De commandline versie van Visual Basic).
Met CreateProcess kun je de uitvoer van het programma krijgen en inlezen en dat wil ik graag doen.

De code waar het om gaat is deze:

code:
1
If CreateProcess(vbNullString, cmdLine, pra, tra, True, 0, Null, vbNullString, sui, pi) <> 0 Then

De andere parameters staan allemaal goed of hebben niets met mijn probleem te maken. (Zo leerde google mij)

Het gaat even om de cmdLine. Gewoon een programmanaam werkt, en "ping 127.0.0.1" ook.
Bij Nero wordt het wat lastiger.

Simpelweg
code:
1
cmdLine = "C:\Program Files\Ahead\Nero\nerocmd.exe --cdinfo--drivename d"""


Levert een internal error.

Wederom googlen leerde mij dat de programmanaam tussen " moest staan, dus dit geprobeerd:
code:
1
cmdLine = """C:\Program Files\Ahead\Nero\nerocmd.exe""" & " ""--cdinfo--drivename d"""


(Waarbij "" de vb-escapecode is om 1 " in de string te krijgen)

Hier wordt nero wel opgestart maar wordt geklaagd over een 'bad -- parameter'

Verder heb ik de volgende cmdLine's geprobeerd:

code:
1
2
3
4
"""C:\Program Files\Ahead\Nero\nerocmd.exe""" & " --cdinfo --drivename d"
"""C:\Program Files\Ahead\Nero\nerocmd.exe""" & " ""--cdinfo --drivename d"""
"""C:\Program Files\Ahead\Nero\nerocmd.exe""" & """--cdinfo"" &  """--drivename d"""
"""C:\Program Files\Ahead\Nero\nerocmd.exe""" & " ""--cdinfo""" & " ""--drivename d"""

Maar alles zonder het gewenste resultaat.

Oftewel: er is iets mis met de manier waarop ik argumenten doorgeef.
En de grote vraag is nu: wat? Iemand die weet hoe ik dit moet aanpakken?

Ps. Excuses voor de lange regels code... ;)

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
probeer eens in een console om te zien hoe het er uit moet zien.

je kunt natuurlijk ook nerocmd op je path zetten als het niet wil lukken... ;)

bij mij werkt een exe (in console als volgt)

"c:\some directory with spaces\executable.exe" --aParam --andAnotherone

dus je string:

myString """dir"" --aparm --aaa "...

[ Voor 39% gewijzigd door hobbit_be op 25-02-2003 18:43 ]


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Als gewoon cmd moet ik:
"C:\Program Files\Ahead\Nero\nerocmd.exe" --cdinfo --drivename d

gebruiken, de eerste van de rij hierboven dus eigenlijk.

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • Adion
  • Registratie: Januari 2001
  • Laatst online: 10:02
Probeer misschien eens met ShellExecute
Daar moet je wel de parameters als een apparte string meegeven.

VirtualDJ 2026 - Fast Image Resizer - Instagram


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
ShellExecute is geen optie, want ik wil de uitvoer kunnen inlezen (en dan kan dus met CreateProcess, overigens: als iemand weet of en hoe dat met ShellExecute ook kan hoor ik het wel ;) )

En in console moet ik dus ongeveer hetzelfde invoeren maar dat staat er al bij en dat werkt niet....

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

In C++ werkt dit prima hoor:
C++:
1
2
3
4
5
6
7
STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
CreateProcess(NULL, "\"C:\\Program Files\\Ahead\\Nero\\NeroCmd.exe\" --version",
              NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

www.madwizard.org


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Hmm, maar in vb niet.
Iemand enig idee waarom? :)

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Maak van die twee vbNullString's eens echte Null's, een lege string is niet hetzelfde als null, als ik die twee vervang door "" in C++ werkt het ook niet.

www.madwizard.org


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Dan roept Visual Basic 'Invalid use of Null,' oftewel: daar MOET een vbNullString staan.
Maar dat zal het ook niet zijn want de help zegt daarover:
:vbNullString: String having value 0 Not the same as a zero-length string (""); used for calling external procedures
Dus ik denk zo dat het daar niet aan ligt...

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

edit:
--- beter lezen.. |:( zie nu pas dat vbNullString toch zou moeten werken ---

Hmm toch zou het moeten kunnen, het mag volgens de documentatie:
lpApplicationName:
[...]The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space-delimited token in the lpCommandLine string.[...]
lpCurrentDirectory:
[...]If this parameter is NULL, the new process will have the same current drive and directory as the calling process.[...]
Lijkt dus een limitatie van VB, moet vast wel een oplossing voor zijn. Die 2e vbNullString zou je nog wel kunnen vervangen door GetCurrentDirectory maar die 1ste moet echt NULL zijn. "" ziet windows als een programmanaam die ie vervolgens niet kan vinden.

[ Voor 8% gewijzigd door madwizard op 25-02-2003 20:32 ]

www.madwizard.org


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Die tweede vbNullString vervangen heeft geen effect, of ik het nou vervang door app.path of het path waar Nerocmd staat.
Overigens zou dat niet uit mogen maken, in de c++ code staat daar tenslotte ook een NULL.
Maar ik zie in de c++ code ergens een False staan waar in de vb-code een True staat. En als ik die True vervang door False crashed mijn programma. In de standaardcode stond echter ook al True, en met ping werkte dat ook (en tenslotte is 127.0.0.1 eigenlijk ook een argument bij die ping...)

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Maak i.p.v. vbNullString of vbNull of NULL eens gewoon de parameter 0&

Dus:
code:
1
If CreateProcess(vbNullString, cmdLine, pra, tra, True, 0, 0&, 0&, sui, pi) <> 0 Then

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Nee, dat werkt helaas ook niet. Dan zie ik helemaal niets in de uitvoer, er wordt dus niet eens een poging gewaagd het programma te starten.

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Omdat ping welk werkt, zit het probleem 'm er dus kennelijk in het feit dat je een programma uit een rare dir opstart. Porbeer het eens als volgt: eerst een chdir naar "c:\program files\ahead\nero\" en dan de CreateProcess op alleen "nerocmd.exe". Of equivalent, een CreateProcess op "nerocmd.exe" met "c:\program files\ahead\nero\" als current directory...

  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Ook dan geeft hij in sommige gevallen een Internal Error, en in sommige gevallen wordt NeroCmd wel opgestart maar geeft het een Invalid -- paramneter en Bad Usage.

Als ik een eigen testprogramma maak om te zien hoe de parameters worden meegegeven lijkt dit wel goed te gaan.
Als comdLine
"test.exe" --cdinfo --drivename d
geeft test.exe als argumenten
--cdinfo --drivename d
(waarbij test.exe alleen maar de argumenten op het scherm print)

Waarom gaat het met NeroCmd dan toch niet goed?

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Kennelijk is dat NeroCmd een heel raar dingetje. Is er een verschil tussen aanroepen waarbij het fout en waarbij het goed gaat? Als het steeds dezelfde aanroep is, maar de ene keer gaat het goed en de volgende keer gaat het fout, dan is NeroCmd echt heel raar.

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Omdat er een Dos7+ directory in staat? :) Gebruik eens deze API:
code:
1
2
3
Private Declare Function GetShortPathName Lib "kernel32"
Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As
String, ByVal cchBuffer As Long) As Long


(Werkt als een standaar GetWindowsDirectory API call met buffer e.d.)

Dan zal je zien dat je iets krijgt zoals:

c:\progra~1\ahead\nero

En ik gok dat dat wel goed gaat werken :) Ik heb er ook problemen mee gehad met Access DB's.. in VB zelfde probleem.

[ Voor 4% gewijzigd door Sponge op 26-02-2003 09:48 . Reden: ff layout gefixed, denk ik ]


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Nee, dat werkt ook niet. Zou eigenlijk ook vreemd zijn, want hij kan het programma zelf wel vinden (de Bad Usage foutmelding komt daarvandaan) en als ik met ChDir naar de juiste map ga en vervolgens alleen het programma start werkt het ook niet.

Ik denk dat het meer ligt aan de manier waarop de argumenten door worden gegevn, maar wat er dan precies mis weet ik dus niet

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Is sui goed geinitialiseerd? Aan de filename ligt het niet denk ik, de C++ versie werkte zelfs zonder quotes om het volledige pad (niet-8.3).

www.madwizard.org


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Dat zou ik eigenlijk niet weten... Waar zou sui op moeten staan?
Nu staat er in ieder geval dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Type STARTUPINFO
  cb As Long
  lpReserved As Long
  lpDesktop As Long
  lpTitle As Long
  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 Byte
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type

[...]

sui.cb = Len(sui)
GetStartupInfo sui
sui.hStdOutput = hWrite
sui.hStdError = hWrite
sui.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
sui.wShowWindow = SW_HIDE

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Lijkt wel te kloppen, en gewoon GetStartupInfo eroverheen zonder die aanpassingen daaronder?

www.madwizard.org


  • Hertog
  • Registratie: Juni 2002
  • Laatst online: 15:22

Hertog

Aut bibat, aut abeat

Topicstarter
Dan komt dezelfde foutmelding in een dosbox en hangt het programma. Ik gok dat die stdOutput en stdInput de redirect verzorgen. Helaas dus ook geen oplossing...

"Pray, v. To ask that the laws of the universe be annulled in behalf of a single petitioner, confessedly unworthy." --Ambrose Bierce, The Devil's Dictionary

Pagina: 1