Как из VB запустить exe файл?
Dummy = Shell("путь", параметр)
Но вот проблема, большие программы(типа GTA III, Mafia, Counter strike и тп.) не запускает, ругается и все. Кто знает, может можно как-нибудь по другому запускать?
зы: не в тему :D , при регистации заметил ощибку(буква Р в слове опция)) Легкий ввод vbCode?
Если вы включите эту оРцию, то на страницах создания сообщения будет выведен интерфейс простого использования vbCode.
Вообще я файлы запускал с помощью функции:
Dummy = Shell("путь", параметр)
Но вот проблема, большие программы(типа GTA III, Mafia, Counter strike и тп.) не запускает, ругается и все. Кто знает, может можно как-нибудь по другому запускать?
зы: не в тему :D , при регистации заметил ощибку(буква Р в слове опция)) Легкий ввод vbCode?
Если вы включите эту оРцию, то на страницах создания сообщения будет выведен интерфейс простого использования vbCode.
Попробуй CreateObject(class,[servername])
class Required; Variant (String). The application name and class of the object to create. :-?
ServerName я думаю в твоем случае не пригдится...
С твоим предложение вообще ниче не получилось(по моему это вобще чушь какая-то). Или напиши код полный(путь куда вставлять то там???)
Объясняю что мне надо. Например на форме есть кнока, при нажатии на которую открыватся программа(в моем случае игра), и обязятельно больших размеров(не калькулятор! или типа него). Как это сделать?
Или я тупой, или ты не понял че я хотел...
С твоим предложение вообще ниче не получилось(по моему это вобще чушь какая-то). Или напиши код полный(путь куда вставлять то там???)
Объясняю что мне надо. Например на форме есть кнока, при нажатии на которую открыватся программа(в моем случае игра), и обязятельно больших размеров(не калькулятор! или типа него). Как это сделать?
В этом случае путь не прописывается...
...а класс - берешь из реестра (если игра там прописана)...
...Например:
Set XL=CreateObject("Excel.Application")
...
Понятно все кроме того что в скобках. Более точно опиши откуда берется. А то ведь реестр большой...
Set XL=CreateObject("Excel.Application")
Понятно все кроме того что в скобках. Более точно опиши откуда берется. А то ведь реестр большой...
В данном случае из HKEY_CLASSES_ROOT, но есть одно но:
таким образом я запускал только Майкрософтовские проги, на играх тестить не могу, т.к. у меня их и дома нету, а тем более на работе...
...хотя...
есть такая штука, называется WinSpy (у меня в составе программы nnCron)...
...так вот при помощи ее можно узнать очень много интересного про интересующую тебя прогу (в том числе и класс)...
...пробуй:)
Скачал этот ннкрон, прикольная вещь, тока никаких классов связанных с играми не находит(видать их просто нету в отличие от микрософтских прог)
Ну кто еще может посоветовать? А то очень нужно это.
зы: цитировать необязятельно )))
Интересно, а почему ругается Shell? Я думал, ему пофигу, какие ехешники... :???:
Warcraft-3 у меня запустился из Shell в VBA.
Либо эта игра не столь ресурсоемка. Либо у меня этих ресурсов много.
Warcraft-3 у меня запустился из Shell в VBA.
Либо эта игра не столь ресурсоемка. Либо у меня этих ресурсов много.
Ворик почти не жрет ничего, у меня он тож запускается, а вот помощнее(Battle field например)
не хочет. Я просто не точно на счет "ругается" выразился. Он либо а)виснет б)ноль эффекта. На счет ресурсов: у меня проц 1.8 Ггц и 512мб оперативки, я думаю этого достаточно.
Модуль:
Option Explicit
'************ Code Start **********
Private Declare Function apiShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" _
(ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long
'***App Window Constants***
Public Const WIN_NORMAL = 1 'Open Normal
Public Const WIN_MAX = 2 'Open Maximized
Public Const WIN_MIN = 3 'Open Minimized
'***Error Codes***
Private Const ERROR_SUCCESS = 32&
Private Const ERROR_NO_ASSOC = 31&
Private Const ERROR_OUT_OF_MEM = 0&
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&
'***************Usage Examples***********************
'Open a folder: ?ShellExecuteMy("C:\TEMP\",WIN_NORMAL)
'Call Email app: ?ShellExecuteMy("mailto:dash10@hotmail.com",WIN_NORMAL)
'Open URL: ?ShellExecuteMy("http://home.att.net/~dashish", WIN_NORMAL)
'Handle Unknown extensions (call Open With Dialog):
' ?ShellExecuteMy("C:\TEMP\TestThis",Win_Normal)
'Start Access instance:
' ?ShellExecuteMy("I:\mdbs\CodeNStuff.mdb", Win_NORMAL)
'****************************************************
Function ShellExecuteMy(stFile As String, lShowHow As Long)
Dim lRet As Long, varTaskID As Variant
Dim stRet As String
'First try ShellExecute
lRet = apiShellExecute(hWndAccessApp, vbNullString, _
stFile, vbNullString, vbNullString, lShowHow)
If lRet > ERROR_SUCCESS Then
stRet = vbNullString
lRet = -1
Else
Select Case lRet
Case ERROR_NO_ASSOC:
'Try the OpenWith dialog
varTaskID = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " _
& stFile, WIN_NORMAL)
lRet = (varTaskID <> 0)
Case ERROR_OUT_OF_MEM:
stRet = "Error: Out of Memory/Resources. Couldn't Execute!"
Case ERROR_FILE_NOT_FOUND:
stRet = "Error: File not found. Couldn't Execute!"
Case ERROR_PATH_NOT_FOUND:
stRet = "Error: Path not found. Couldn't Execute!"
Case ERROR_BAD_FORMAT:
stRet = "Error: Bad File Format. Couldn't Execute!"
Case Else:
End Select
End If
ShellExecuteMy = lRet & _
IIf(stRet = "", vbNullString, ", " & stRet)
End Function
'************ Code End **********
1) Option Compare Database - не хочет принимать , выделяет как ошибку, просит чтоб вместо database ввели Text или Binary
2) Как я понял весь код вставляется в модуль. Вставил.
3)Usage Examples - это типа пример? Какой из них использовать? я использовал строки(сразу говорю пути я использовал свои и пытался загрузить exeшник в обоих примерах)
а)?ShellExecuteMy("C:\TEMP\TestThis",Win_Normal)
б)?ShellExecuteMy("I:\mdbs\CodeNStuff.mdb", Win_NORMAL)
не одна из них не пошла, при их вызове говорит переменна не определена - Application.hwnd
Если у когото пошла, выложите исходник для скачивания.
Вот, выкладываю рабочий вариант, просто нажми кнопку.
P.S. на играх проверить не могу, так как не имею их на работе, это остается за тобой
В xml работает, при преносе в VB не пашет, говорит что переменная не определена Application.hWnd(выделяет то что до точки). Что вобще там должно находится? Мож вручную попробовать прописать?
Тут, я так понял, используется Экселевский OpenFileName-диалог, поетому в VB он работать не будет...
1) Если открываеш программу, которая должна открывать игру, вручную (при этом помещаеш свою прогу в папку игры), то игра ЗАПУСКАЕТСЯ.
2) Если просто пытаешься открыть прогу которая должна открыть игру (при это твоя прога не лежит в папке игры), то игра НЕ ЗАПУСКАЕТСЯ.
3) Если пытаешся открыть программу которая должна открыть другую программу(которая лежит в папке игры) которая должно открыть игру, то нифига не получается.
Короче чушь полная какая-то. Я так и не понял в чем прикол.
ps Замутно написано так что внимательней читайте)
щас попробовал поманипулировать с обычным шеллом вот что получилось:
1) Если открываеш программу, которая должна открывать игру, вручную (при этом помещаеш свою прогу в папку игры), то игра ЗАПУСКАЕТСЯ.
2) Если просто пытаешься открыть прогу которая должна открыть игру (при это твоя прога не лежит в папке игры), то игра НЕ ЗАПУСКАЕТСЯ.
3) Если пытаешся открыть программу которая должна открыть другую программу(которая лежит в папке игры) которая должно открыть игру, то нифига не получается.
Короче чушь полная какая-то. Я так и не понял в чем прикол.
ps Замутно написано так что внимательней читайте)
Странно, причем тут папки-мамки? Может, ты с путями ошибся?
Тут, я так понял, используется Экселевский OpenFileName-диалог, поетому в VB он работать не будет...
Я еще не такой тупой))) Я все часть с открытием OpenFileName-диалога удалил и вручную прописал путь, просто не помню как на VB аналогичная функция пишется.
Если да, то передавай в fileToOpen String-константу, содержащую полное имя твоего файла (т.е. с путем к ниму), и так для каждой кнопки...
...и еще в начале кинь строку:
ChDir PathToGame 'Путь к екзешнику игры...
Private filepath As String
Private Sub cmd1_Click()
Dim filepath As String
ChDir "D:\Games\Battlefield 1942 The Road to Rome"
filepath = "D:\Games\Battlefield 1942 The Road to Rome\BF1942.exe"
dummy = Shell(filepath, vbNormalFocus)
End Sub
Private Sub cmd2_Click()
ChDir "D:\Games\Battlefield 1942 The Road to Rome"
filepath = "D:\Games\Battlefield 1942 The Road to Rome\BF1942.exe"
Call ShellExecuteMy(filepath, WIN_NORMAL)
End Sub
это 2 разные кнопки. не одна из них не пашет. Модуль подсоединен. При нажатии 2ой кнопки выдает все тоже: переменная не определена Application.hWnd. У меня такое чувство что Application.hWnd вообще не в тему(или ее на аналог в vb замениь надо), он с ней даже компилировать не хочет.
2) в excel работает(если модуль с оснвным кодом не менять, а менять тока часть вызова игры)
Ты передаешь в apiShellExecute hWnd Excel-я?
Я так понял там требуется хэндл "детонатора"...
...если я прав, то:
To Санчез:
Public Declare Function GetFocus Lib "user32"
Public YourApphWnd as Long
Alias "GetFocus" () As Long
Сразу после запуска формы:
YourApphWnd=GetFocus(),
и тогда:
lRet = apiShellExecute(YourApphWnd, vbNullString, stFile, vbNullString, vbNullString, lShowHow)
...иначе (там ведь ByVal hWnd) не передавай ничего...
...попробуй.
- туда следует пихать hWnd программы из которой ты инициируешь процесс запуска.
В Vb6 в этой роли выступает hWnd твоей формы (на ней же расположена кнопка, нажимая на которого ты запускаешь эту функцию) - т.е. Me.hWnd
Теперь о компиляции, если ты засунул все это в отдельный модуль в Vb6, то там конечно объект Me не существует и не виден, просто надо тогда немного изменить функцию ShellExecuteMy вот так:
ShellExecuteMy(ApphWnd as Long, stFile As String, lShowHow As Long)
а в коде, написать: apiShellExecute(ApphWnd, и т.д.
ну а вызывать из обработчика кнопки:
Call ShellExecuteMy(Me.hwnd, "C:\ля-ля",Win_Normal)
Public Declare Function GetFocus Lib "user32" _
Alias "GetFocus" () As Long
Public YourApphWnd as Long
Load UserForm1
UserForm1.Show
'Сразу после запуска формы:
YourApphWnd=GetFocus()'.....
Call ShellExecuteMy(fileToOpen, WIN_NORMAL, _
YourApphWnd)
'и тогда:
'....
lRet = apiShellExecute(YourApphWnd, _
vbNullString, stFile, vbNullString, _
vbNullString, lShowHow)
Да и еще одно у меня уже пол второго ночи так что я скоро спать пойду.
Но ведь надо смотреть что и куда вставляешь!!!
Это пишется до начала Саба:
Public Declare Function GetFocus Lib "user32" _
Alias "GetFocus" () As Long
Public YourApphWnd as Long
потом:
Sub main()
Load UserForm1
UserForm1.Show
YourApphWnd=GetFocus()'.....
'.....и вот тута ты получил Хэндл своей формы
'который и надо передавать в те функции...т.е.
Call ShellExecuteMy(fileToOpen, WIN_NORMAL, _
YourApphWnd)
'....
end sub
Ты случаем не из Уфы???
Уж очень ник у тебя знакомый...
To Санчез:
Ты случаем не из Уфы???
Уж очень ник у тебя знакомый...
Пол-второго ночи - это плюс 7 от Москвы. Тянет на Хабаровск или Владивосток.
Пол-второго ночи - это плюс 7 от Москвы. Тянет на Хабаровск или Владивосток.
Понятно...
...есть один знакомый Санчес в Уфе, ...
...но ...да, у них где то +3 или +4.
...у меня вообще только 18.02 (рабочий день подошел к концу)
так что до завтра:)
Сделал, откомпилировал, работает но эффекта как и говорил раньше ноль. Запускается, жмеш на кнопку появляются часы сек 10 проходит и ниче не происходит, а кидаеш в папку игры))) работает)))...
открываются - Warcraft III ; Fallout 2 ;
не открываются - Battlefield 1942 ; Blade of Darkness ; Empire Earth ; The Sims Unleashed
Как и говорил раньше, если прогу кидать в папку с игрой - то открывается все, иначе не фурычит. Попробуйте у кого есть пооткрывать те которые у меня не открываются, мож просто у меня комп глючит... Я как понял надо ему надо указать рабочий каталог игры(тут XtreamAll уже предлагал вариант: ChDir PathToGame 'Путь к екзешнику игры... , тока толку о него нету), мож кто еще че наподобие этого знает?
Насчет ChDir:
писал прогу (планировщик задач), для системы управления предприятием...
...тут наткнулся на то, что все пути в этой системе - относительные (не подключались модули).
...при помощи ChDir "чекнул" нужную дерикторию...
...и усе заработало!
Так вот. Я думаю в твоем случае проблема похожая.
...тогда я нашел такую вот штуку (API):
'Это вставь в модуль с функцией ShellExecuteMy,
'но только не в саму ф-ю!!! а перед ней...
Public Path As String
Public Declare Function SetCurrentDirectory _
Lib "kernel32" Alias "SetCurrentDirectoryA" _
(ByVal lpPathName As String) As Long
...а потом уже в самой ф-ии, сразу перед вызовом:
lRet = apiShellExecute(Form1.hWnd, _
vbNullString, stFile, vbNullString, _
vbNullString, lShowHow)
...вставляй:
SetCurrentDirectory (Path)
У меня только что получилось!
Удачи.