Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Пн Июл 13, 2009 2:25 pm Заголовок сообщения: не запускается Word/Excel через Run Program |
|
|
так работает
Run Program "C:\Program Files\Microsoft Office\OFFICE11\WinWord.exe"
а так не работает
Run Program "WinWord"
хотя так работает
Run Program "Notepad"
и через командную строку оба приложения запускаются успешно (WinWord и Notepad)
Почему из мапбейсика word не запускается аналогично блокноту?
Попробовала в Delphi получить путь из реестра к Word, но что-то у меня не заработала dll в MapBasic Говорит, что функция (читающая путь из ключа) не определена, хотя в MapBasic она прописана, имя совпадает с экспортируемым из dll |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Июл 14, 2009 9:10 am Заголовок сообщения: |
|
|
notepad запускается, потому что путь до него есть в переменной path операционной системы (notepad лежит в каталоге windows, а он есть в пути path). Путь до winword не прописан в переменной path, поэтому при попытке запуска из MapInfo, она его не может найти. То, что winword запускается из командной строки - это видимо трюк Microsoft'а, наверное Windows как-то отдельно знает где это приложение установлено :)
Итак вывод - прописать путь до winword в переменную path |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Вт Июл 14, 2009 12:58 pm Заголовок сообщения: |
|
|
Про path понятно. Хотя я давненько уже слышала и даже использовала такой фокус, можно в реестре прописать исполняемым файлам псевдонимы. например, для Notepad - "np", для Total Commander - "tc", и т.п. И тогда из командной строки программы запускаются по псевдонимам. И сейчас посчитала, что для MS Word при установке по умолчанию уже задан такой псевдоним WinWord, поэтому запускается из ком.строки только по имени, без пути.
Заведение пути к Word в Path не пойдет. Надо, что бы у всех пользователей Word запускался независимо от настроек системы. Получается - только через DLL, где путь из реестра читается. Осталось заставить ее работать в MapBasic |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Июл 14, 2009 1:51 pm Заголовок сообщения: |
|
|
1) Про псевдонимы - да, возможно. Создать такой псевдоним для Mapinfo?
2) Покажите декларацию функции из DLL и какую ошибку возвращает ее вызов? |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Ср Июл 15, 2009 12:56 pm Заголовок сообщения: |
|
|
Нет, для MapInfo ничего прописывать не нужно, как и для Word. Надо всего лишь определить путь к приложению Word, куда он установлен у пользователя.
Переделала еще раз DLL. Теперь ошибка не комментируется никак, просто MapInfo при вызове функции из DLL вылетает с сообщением "MapInfo... - обнаружена ошибка. Приложение будет закрыто..." Что не так?
Вот ее определение и вызов в MapBasic:
Declare Function PathToApp lib "явный путь" (ByVal KeyName As String) As String
path_word = PathToApp("SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe")
Вот сама функция в дельфи:
function PathToApp(KeyName: string):string; export;
var
reg: TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
If Not reg.OpenKeyReadOnly(KeyName) Then
Exit;
Result := reg.ReadString('Path');
finally
reg.CloseKey;
reg.Destroy;
end;
end;
exports
PathToApp; |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Ср Июл 15, 2009 5:14 pm Заголовок сообщения: |
|
|
1) string в параметрах MapBasic врядли поймет, да и утечку памяти получите. Обычно в DLL используют PChar и т.п.
2) модификатор stdcall неплохо было бы прописать
function PathToApp(KeyName: string):string; stdcall; export;
3) Воспользуйтесь стандартными dll для доступа к реестру:
Define HKEY_CURRENT_USER &H80000001
Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Integer, ByVal lpSubKey As String, lpValue As String * 255, lpcbValue As Integer) As Integer
Dim RStr As String * 255
Dim D, Size As Integer
Size = 255
D = RegQueryValue(HKEY_CURRENT_USER, "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe", RStr, Size) |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Чт Июл 16, 2009 4:33 pm Заголовок сообщения: |
|
|
Да что за беда.. Про все новые сообщения в почту объявления приходят, кроме этой моей темы.
Прозевала ответ
Уже переделала функцию в DLL - не путь получаю, а просто ворд запускаю. и только что подсказали про несовместимость типов. Передаю теперь "pchar". Это и надо было сразу мне прописывать, сама не догадалась.
Про реестр учту, скоро пригодится. Спасибо! |
|
Вернуться к началу |
|
|
|