Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как из DLL (VB6) определить путь к использующему ее офисному приложению / 6 сообщений из 6, страница 1 из 1
29.09.2003, 15:44
    #32278454
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из DLL (VB6) определить путь к использующему ее офисному приложению
Есть офисное приложение (Excel или Word), использующее мою DLL, сделанную на VB6.
Как мне в функции этой DLL определить путь к этому использующему ее приложению, ( ну и имя как дополнение ) ?
При этом нельзя передавать объект Application ( или , например, WorkBook , по которым можно было бы этой функции определить путь ), т.е. определяющая путь функция не должна знать откуда она вызвана, а только должна каким-то образом понять к чему прицеплена содержащая ее DLL-ка.

Т.е. нужна какая-то API Windows функция.
...
Рейтинг: 0 / 0
29.09.2003, 16:29
    #32278521
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из DLL (VB6) определить путь к использующему ее офисному приложению
Попробуй эту, вроде то

Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
...
Рейтинг: 0 / 0
29.09.2003, 16:31
    #32278525
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из DLL (VB6) определить путь к использующему ее офисному приложению
Чуть не забыл:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
· hProcess
[in] Handle to the process that contains the module.

· hModule
[in] Handle to the module.

· lpFilename
[out] Pointer to the buffer that receives the fully qualified path to the module. If the file name is longer than maximum number of characters specified by the nSize parameter, the file name is truncated.

· nSize
[in] Specifies the maximum number of characters to copy to the lpFilename buffer.


Return:
If the function succeeds, the return value specifies the length of the string copied to the buffer. 

If the function fails, the return value is zero. To get extended error information, call GetLastError. 
...
Рейтинг: 0 / 0
29.09.2003, 16:44
    #32278556
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из DLL (VB6) определить путь к использующему ее офисному приложению
Так и какие же нужно задать ·hProcess и .hModule если DLL подцеплена к Excel ?
...
Рейтинг: 0 / 0
29.09.2003, 17:34
    #32278658
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из DLL (VB6) определить путь к использующему ее офисному приложению
Лучше эту функцию используй, она для всех виндов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Declare Function GetModuleFileName Lib  "kernel32"  Alias  "GetModuleFileNameA"  (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long

· hModule
Identifies the module whose executable filename is being requested. If this parameter is NULL, GetModuleFileName returns the path for the file used to create the calling process.

· lpFilename
Points to a buffer that is filled in with the path and filename of the given module.

· nSize
Specifies the length, in characters, of the lpFilename buffer. If the length of the path and filename exceeds this limit, the string is trunc

If the function succeeds, the return value is the length, in characters, of the string copied to the buffer. 

If the function fails, the return value is zero. To get extended error information, call GetLastError. 


Простой пример использования:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Declare Function GetModuleFileName Lib  "kernel32"  Alias  "GetModuleFileNameA"  (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function GetWindowWord Lib  "user32"  (ByVal hwnd As Long, ByVal nIndex As Long) As Integer
Const GWW_HINSTANCE = (- 6 )
Private Sub Form_Load()
    Dim ModuleName As String, FileName As String, hInst As Long
    'create a buffer
    ModuleName = String$(128, Chr$(0))
    'get the hInstance application:
    hInst = GetWindowWord(Me.hwnd, GWW_HINSTANCE)
    'get the ModuleFileName:
    'enter the following two lines as one, single line:
    ModuleName = Left$(ModuleName, GetModuleFileName(hInst, ModuleName, Len(ModuleName)))
    Me.Caption  "Module Filename: "  + ModuleName
End Sub


Ну а hwnd Excela как ты понимаешь надо искать самому, запросто так он не валяется, на то он и API.

Обычно самый простой вариант - через поиск по классу:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

hwndExl = FindWindow("XLMAIN", vbNullString)
...
Рейтинг: 0 / 0
29.09.2003, 21:20
    #32278933
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из DLL (VB6) определить путь к использующему ее офисному приложению
Не это все не то- см. исходную постановку.
Объясню еще - у меня была библиотека для Excel'ских приложений в виде XLA , с целью секретности (не надеясь на то, что пароль не взломают) я несколько ее определяющих функйий вынес в DLL, а в них как раз определялся путь к активной книге,
После вынесения их в DLL они стали определять путь к DLL а не к активной книге , передавать в них какие-либо параметры типа объект Application ( или , например, WorkBook ) равно как и hProcess нельзя по причине, что эти функции уже использует куча приложений,
Поэтому я так и поставил задачу.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как из DLL (VB6) определить путь к использующему ее офисному приложению / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]