Запуск Ярлыка(lnk) командой ShellExecute

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Запуск Ярлыка(lnk) командой ShellExecute

Сообщение TrueTrue » 28.12.2013 (Сб) 2:48

Доброй ночи. Возникла проблема.

Win7 x64, VB6

Сделал програмку, всплывающие панельки как в WinXP, с права и с лева, которая вычитывает из папки Ярлыки, выводит мне список и я запускаю их.

С другими ярлыками, на любых дисках, программа отлично работает. ShellExecute возвращает код 42
Но вот, появилась парочка ярлыков, которые лежат на диске C:\Program Files на которые ShellExecute возвращает код 5.
Такие например как Paint.NEt и Virtual Box.

Есть другие програмы, которые так же лежат на диске C:\Program Files, типа Alcohol они отлично стартуют.
Руками ярлыки я стартую нормально, но программно, через ShellExecute никак не могу.

Стартовал свой Exe с админ правами, ничего не меняется.

Таких ярлыков всего несколько.

Подскажите хоть какие-то мысли, идеи... Спасибо.

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение TrueTrue » 28.12.2013 (Сб) 2:49

Только что написал, а после уже сам подумал, может проблема в x64 битах, хотя приложения вроде эти 32 битные...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение iGrok » 28.12.2013 (Сб) 3:19

http://stackoverflow.com/questions/1504 ... r-messages

Если вкратце, чтобы понять, что пошло не так, нужно использовать ShellExecuteEx, а потом смотреть реальный код ошибки при помощи GetLastError.
label:
cli
jmp label

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение TrueTrue » 28.12.2013 (Сб) 3:37

Код: Выделить всё
Public Function StartDoc(DocName As String) As Long
     DocName = GetDosFileName(DocName)
    Dim t As Byte
    Dim Scr_hDC As Long
    Scr_hDC = GetDesktopWindow()
            Dim w As SHELLEXECUTEINFO
            Dim hhh As Long, h1 As Long, retval As Long
            w.cbSize = Len(w)
            w.lpVerb = "open"
            w.nShow = SW_NORMAL
            w.fMask = SEE_MASK_NOCLOSEPROCESS
            w.hInstApp = hhh
            w.hProcess = h1
            w.hwnd = Scr_hDC
            w.lpDirectory = sPath(DocName)
            w.lpFile = DocName
            retval = ShellExecuteEx(w)
            ShellExecute Scr_hDC, "open", DocName, 0, 0, SW_NORMAL
    End Select
End Function


Как в этом коде мне лучше применить GetLastError?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение iGrok » 28.12.2013 (Сб) 5:26

А зачем там дополнительно ShellExecute?
И зачем там вот это: DocName = GetDosFileName(DocName)? Не в нём ли проблема?

Собственно, если retval <= 32, получай код ошибки по GetLastError. Можно ещё текст получить через FormatMessage, но в принципе уже по коду можно будет понять, что происходит.
label:
cli
jmp label

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение TrueTrue » 28.12.2013 (Сб) 17:00

Ошибка точно не в этой строке.
Этой строкой я получаю ДОС вариант строки, так как думал, что проблема заключена в каких либо, русских или других символах в строке. Которые ShellExecute не верно воспринимает.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.12.2013 (Вс) 20:04

TrueTrue писал(а):Этой строкой я получаю ДОС вариант строки

А он существовать не обязан ведь...

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение The trick » 30.12.2013 (Пн) 11:03

Добавлю что вместо GetLastError, надо вызывать Err.LastDllError.
UA6527P

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение TrueTrue » 10.01.2014 (Пт) 21:48

Наконец-то разобрался откуда берётся ошибка, но никак не могу найти решение!

Ситуация следующая:

У меня Win 7 x64

Соответственно 2 папки Program Files

Всё приложения, что кладутся в папку Program Files (x86) или на другие диски, с ними проблем нет.
C приложениями которые инсталятся в папку Program Files у меня возникает описанная выше проблема. К примеру с VirtualBox.

Кто знает достоверные причины и как решить данную проблему, прошу подскажите.

Политики безопасности и доступа к диску и файлам проверил, вроде всё норм.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение iGrok » 10.01.2014 (Пт) 23:40

Ааа.. Проблема в том, что ты пытаешься запустить 64-битное приложение из 32-битного.
Я не знаю нормального способа это сделать, но на просторах сети нашёлся вот такой вариант:

%systemroot%\sysnative\cmd.exe /c "c:\program files\7-zip\7zFM.exe"
У меня сработало.
label:
cli
jmp label

neit95
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 14
Зарегистрирован: 10.03.2013 (Вс) 22:05
Откуда: Калининград

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение neit95 » 11.01.2014 (Сб) 1:23

iGrok писал(а):%systemroot%\sysnative\cmd.exe /c "c:\program files\7-zip\7zFM.exe"
У меня сработало.


тогда лучше:
%systemroot%\sysnative\cmd.exe /c start "c:\program files\7-zip\7zFM.exe"
А то консоль висеть остаётся.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение iGrok » 11.01.2014 (Сб) 2:09

neit95 писал(а):А то консоль висеть остаётся.

Да, так лучше.

Ну и придётся делить ветки кода - отдельно для x86 (обычный запуск) и для x64 (вот этот костыль).
label:
cli
jmp label

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение TrueTrue » 11.01.2014 (Сб) 14:37

Спасибо огромное! Буду попробовать :))) Потом отпишусь. :)

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение NashRus » 11.01.2014 (Сб) 19:00

iGrok писал(а):Ааа.. Проблема в том, что ты пытаешься запустить 64-битное приложение из 32-битного.


Должно запускаться. У меня 7zip и MySql запускаются.
Скорее, у него путь виртуализируется в (x86).

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.01.2014 (Сб) 23:09

iGrok писал(а):Проблема в том, что ты пытаешься запустить 64-битное приложение из 32-битного.

Приложения запускать можно вообще-то должно быть...
Вероятно, проблема именно в том, что через ярлык.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение iGrok » 12.01.2014 (Вс) 2:55

NashRus писал(а):Скорее, у него путь виртуализируется в (x86).

Хм.. Да, вот это больше похоже на правду. Код ошибки-то ТС так и не удосужился написать...
А я что-то не проверил саму возможность запуска изначально, зато сразу нашёл какой-то тред на stackoverflow с похожей проблемой. Там и было то решение-костыль (впрочем, оно и в этом случае должно помочь). А сейчас и сам вижу, что всё запускается.

Если дело действительно в редиректе, тогда лучше так:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx
Applications can control the WOW64 file system redirector using the Wow64DisableWow64FsRedirection, Wow64EnableWow64FsRedirection, and Wow64RevertWow64FsRedirection functions. Disabling file system redirection affects all file operations performed by the calling thread, so it should be disabled only when necessary for a single CreateFile call and re-enabled again immediately after the function returns. Disabling file system redirection for longer periods can prevent 32-bit applications from loading system DLLs, causing the applications to fail.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.01.2014 (Вс) 15:20

iGrok писал(а):Если дело действительно в редиректе, тогда лучше так:

Эм.. Я всегда считал, что этот редирект только для system32... Или нет?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Запуск Ярлыка(lnk) командой ShellExecute

Сообщение iGrok » 12.01.2014 (Вс) 17:21

Qwertiy писал(а):Или нет?

Или нет. Ещё как минимум Program Files, и по-моему ещё пара папок. Не могу найти полного списка.
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 11

    TopList