|
code
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
Shell syntaxI need to run Shell command from VB6 application and I'm not clear with its
proper syntax. This code works: Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe " & """" & strAppPath & "\WorkorderXML.dll" & """" I got it from internet and used as a monkey without understanding the purpose of multible """" Now I need to add a switch /codebase to the command. I tried many variants with no success. Thank you vovan vovan <some***@vovan.com> wrote:
> I need to run Shell command from VB6 application and I'm not clear with its In VB, if you want to enclose a quote character within a string literal, you need to > proper syntax. > This code works: > Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe " & """" > & strAppPath & "\WorkorderXML.dll" & """" > > I got it from internet and used as a monkey without understanding the > purpose of multible """" preface it with a second quote character so that VB doesn't think you are terminating the string. The problem is, quote chars are used to start/stop string literals. So, in this case, """" is actually a 1-character string composed of a single quote char. Another way to have written that would've been: Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe """ & strAppPath & "\WorkorderXML.dll""" Same result. You can try these things, by dropping into the Immediate window, and printing them out: ?"Some dead guy wrote, ""To Be, or not To Be...""" > Now I need to add a switch /codebase to the command. Presumably the switch is for regasm? If so, you'd do it like:Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /codebase """ & strAppPath & "\WorkorderXML.dll""" > I tried many variants with no success. ..NET: It's About Trust!-- http://vfred.mvps.org Thank you very much.
It works, and I understand now the purpose of multiple """" vovan Show quoteHide quote "Karl E. Peterson" <k***@mvps.org> wrote in message news:uDa4zs3VHHA.5008@TK2MSFTNGP05.phx.gbl... > vovan <some***@vovan.com> wrote: >> I need to run Shell command from VB6 application and I'm not clear with >> its >> proper syntax. >> This code works: >> Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe " & >> """" >> & strAppPath & "\WorkorderXML.dll" & """" >> >> I got it from internet and used as a monkey without understanding the >> purpose of multible """" > > In VB, if you want to enclose a quote character within a string literal, > you need to preface it with a second quote character so that VB doesn't > think you are terminating the string. The problem is, quote chars are > used to start/stop string literals. So, in this case, """" is actually a > 1-character string composed of a single quote char. Another way to have > written that would've been: > > Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe """ & > strAppPath & "\WorkorderXML.dll""" > > Same result. You can try these things, by dropping into the Immediate > window, and printing them out: > > ?"Some dead guy wrote, ""To Be, or not To Be...""" > >> Now I need to add a switch /codebase to the command. > > Presumably the switch is for regasm? If so, you'd do it like: > > Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe > /codebase """ & strAppPath & "\WorkorderXML.dll""" > >> I tried many variants with no success. > -- > .NET: It's About Trust! > http://vfred.mvps.org > >I need to run Shell command from VB6 application and I'm not clear with its It would help if you showed us the exact line you tried to use rather than >proper syntax. > This code works: > Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe " & > """" & strAppPath & "\WorkorderXML.dll" & """" > > I got it from internet and used as a monkey without understanding the > purpose of multible """" > Now I need to add a switch /codebase to the command. > I tried many variants with no success. saying you added something and it didn't work. Also telling us how it didn't work (error message, crash, nothing at all) would be useful. In the meantime, here is a compilation of several posts I've given in the past regarding the Shell command. See if it help you any. Rick You can use the Shell command. To execute internal DOS command (Dir, Copy, etc. as well as redirection of screen output), the command processor must be specified (using the Environ$ function and "comspec" as its argument returns the correct command processor path on NT and non-NT systems) . Specifying the command processor is safe & generic and will work with non-internal commands also. That syntax, using an XCopy command as an example is: Shell Environ$("comspec") & " /c xcopy """ & _ Source & """ """ & Destination & """ " & Option, vbHide You set the Source and Destination (string variables) to the appropriate paths and the Option (string variable), if any, which can be found by opening an MSDOS Prompt window and typing xcopy /?. (Note: You can type /? after any DOS command at a DOS prompt to list the available options for that command.) One more example would be to list all the files in a directory including subdirectories and subdirectories of subdirectories and all of their files. CommandLine = "dir """ & FileSpec & _ """ /s/b > """ & RedirectTo & """" Shell Environ$("comspec") & " /c " & CommandLine, vbHide Here, the output of a Dir command is redirected to a file-path you specify in the RedirectTo (string variable). The /s/b are options to the Dir command that tell it to recurse throught its subdirectories and not to include header or summary information. I used a variable for the file name so that I could more easily explain the benefit of encasing it in quotemarks. If you redirect to a file that has spaces in its name, or if there are spaces in the path specification itself, then the filename *must* be quoted to protect the spaces from DOS's desire to use them as delimiters. (That's what all those quotemarks in the Shell statement are for.) If the filename doesn't have spaces in it, the quotes aren't necessary BUT they don't hurt either. Hence, the above will work with either. As for your PING question, something like the following should work: strIP = "4.17.23.1" Shell Environ$("comspec") & " /c ping " & _ strIP & " > """ & RedirectFile & """", vbHide Although you didn't specify it in your original post, I assume you want to use vbHide for the optional 2nd parameter to Shell. This hides the DOS window so that your user doesn't see it. If you want the DOS window to remain visible, you would use the vbNormalFocus BUT you must use a /k instead of a /c for the command processor argument. Basically, the /c tells the command processor "here comes a command and, when its finished executing, close the DOS shell it is running in" whereas the /k also tells the command processor that a command follows, but it instructs it to leave the DOS session running. The above assumes you do NOT have to wait for this file to be completely written before your code continues executing. If you have to work with this file right after it is created, consider one of these (which makes your program wait until the DOS process is finished): MICROSOFT 'S OFFICIAL WAY ======================== See this link http://support.microsoft.com/support/kb/articles/Q129/7/96.asp Note: This method doesn't use Shell -- it uses CreateProcessA. FAST AND DIRTY METHOD ====================== Paste these lines in the (General)(Declarations) section of the form where the Shell is being called (or remove the Private keywords and put them in a BAS module if more than one form will use them): Private Declare Function OpenProcess _ Lib "kernel32" _ (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle _ Lib "kernel32" _ (ByVal hObject As Long) As Long Private Declare Function WaitForSingleObject _ Lib "kernel32" _ (ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) As Long Call your Shell command in this form with the appropriate Shell arguments placed in the parentheses: PID = Shell( <<Put Shell Arguments Here>> ) And finally, paste the following IMMEDIATELY after the PID=Shell statement above (making sure to handle the possible error where indicated; i.e. stop the code from falling through to your other commands if the Shell failed): If PID = 0 Then ' 'Handle Error, Shell Didn't Work ' Else hProcess = OpenProcess(&H100000, True, PID) WaitForSingleObject hProcess, -1 CloseHandle hProcess End If Thank you
I followed Karl's advice and it worked. Before it did not add any entry into the registry. vovan Show quoteHide quote "Rick Rothstein (MVP - VB)" <rickNOSPAMnews@NOSPAMcomcast.net> wrote in message news:uExmHt3VHHA.3980@TK2MSFTNGP02.phx.gbl... > >I need to run Shell command from VB6 application and I'm not clear with > >its proper syntax. >> This code works: >> Shell "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe " & >> """" & strAppPath & "\WorkorderXML.dll" & """" >> >> I got it from internet and used as a monkey without understanding the >> purpose of multible """" >> Now I need to add a switch /codebase to the command. >> I tried many variants with no success. > > It would help if you showed us the exact line you tried to use rather than > saying you added something and it didn't work. Also telling us how it > didn't work (error message, crash, nothing at all) would be useful. In the > meantime, here is a compilation of several posts I've given in the past > regarding the Shell command. See if it help you any. > > Rick > > You can use the Shell command. To execute internal DOS command (Dir, Copy, > etc. as well as redirection of screen output), the command processor must > be specified (using the Environ$ function and "comspec" as its argument > returns the correct command processor path on NT and non-NT systems) . > Specifying the command processor is safe & generic and will work with > non-internal commands also. That syntax, using an XCopy command as an > example is: > > Shell Environ$("comspec") & " /c xcopy """ & _ > Source & """ """ & Destination & """ " & Option, vbHide > > You set the Source and Destination (string variables) to the appropriate > paths and the Option (string variable), if any, which can be found by > opening an MSDOS Prompt window and typing xcopy /?. (Note: You can type /? > after any DOS command at a DOS prompt to list the available options for > that command.) One more example would be to list all the files in a > directory including subdirectories and subdirectories of subdirectories > and all of their files. > > CommandLine = "dir """ & FileSpec & _ > """ /s/b > """ & RedirectTo & """" > Shell Environ$("comspec") & " /c " & CommandLine, vbHide > > Here, the output of a Dir command is redirected to a file-path you specify > in the RedirectTo (string variable). The /s/b are options to the Dir > command that tell it to recurse throught its subdirectories and not to > include header or summary information. > > I used a variable for the file name so that I could more easily explain > the benefit of encasing it in quotemarks. If you redirect to a file that > has spaces in its name, or if there are spaces in the path specification > itself, then the filename *must* be quoted to protect the spaces from > DOS's desire to use them as delimiters. (That's what all those quotemarks > in the Shell statement are for.) If the filename doesn't have spaces in > it, the quotes aren't necessary BUT they don't hurt either. Hence, the > above will work with either. > > As for your PING question, something like the following should work: > > strIP = "4.17.23.1" > Shell Environ$("comspec") & " /c ping " & _ > strIP & " > """ & RedirectFile & """", vbHide > > Although you didn't specify it in your original post, I assume you want to > use vbHide for the optional 2nd parameter to Shell. This hides the DOS > window so that your user doesn't see it. If you want the DOS window to > remain visible, you would use the vbNormalFocus BUT you must use a /k > instead of a /c for the command processor argument. Basically, the /c > tells the command processor "here comes a command and, when its finished > executing, close the DOS shell it is running in" whereas the /k also tells > the command processor that a command follows, but it instructs it to leave > the DOS session running. > > The above assumes you do NOT have to wait for this file to be completely > written before your code continues executing. If you have to work with > this file right after it is created, consider one of these (which makes > your program wait until the DOS process is finished): > > MICROSOFT 'S OFFICIAL WAY > ======================== > See this link > > http://support.microsoft.com/support/kb/articles/Q129/7/96.asp > > Note: This method doesn't use Shell -- it uses CreateProcessA. > > > FAST AND DIRTY METHOD > ====================== > Paste these lines in the (General)(Declarations) section of the form where > the Shell is being called (or remove the Private keywords and put them in > a BAS module if more than one form will use them): > > Private Declare Function OpenProcess _ > Lib "kernel32" _ > (ByVal dwDesiredAccess As Long, _ > ByVal bInheritHandle As Long, _ > ByVal dwProcessId As Long) As Long > Private Declare Function CloseHandle _ > Lib "kernel32" _ > (ByVal hObject As Long) As Long > Private Declare Function WaitForSingleObject _ > Lib "kernel32" _ > (ByVal hHandle As Long, _ > ByVal dwMilliseconds As Long) As Long > > Call your Shell command in this form with the appropriate Shell arguments > placed in the parentheses: > > PID = Shell( <<Put Shell Arguments Here>> ) > > And finally, paste the following IMMEDIATELY after the PID=Shell statement > above (making sure to handle the possible error where indicated; i.e. stop > the code from falling through to your other commands if the Shell failed): > > If PID = 0 Then > ' > 'Handle Error, Shell Didn't Work > ' > Else > hProcess = OpenProcess(&H100000, True, PID) > WaitForSingleObject hProcess, -1 > CloseHandle hProcess > End If > > > |
|||||||||||||||||||||||