Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вызов API, void ** Arg / 13 сообщений из 13, страница 1 из 1
18.03.2009, 11:12
    #35875993
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
PB 9.03 Build 8836
Уважаемое сообщество!
Возникла проблема, которую пока не могу решить, посему прошу совета.
Есть некоторая Lib.DLL, в которой определен метод void func( void **Arg )
Вопрос:
Как описать этот метод в PB, а именно, как описать аргумент метода?
В паутине уже был, ничего, к сожалению, не нашел.
Заклинание Филиппа "Зачем?" не предлогать, DLL есть, к ней надо стучаться, увы.
...
Рейтинг: 0 / 0
18.03.2009, 13:33
    #35876554
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Объект по ссылке, более подробно может расказать либо Филипп, либо 18-я весна
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
18.03.2009, 21:50
    #35877896
18-я весна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Смотря на что возвращается указатель.
Общем случае - то, на что указывает указатель никак нельзя вернуть.
Но если интересует только значение самого указателя, то объявляйте так:
Код: plaintext
1.
subroutine func(ref ulong arg ) alias for "func" library "lib"

При этом если возвращается указатель на строку с завершающим нулем, то получить ее можно будет так:
Код: plaintext
ls_str = String(arg, "address") // здесь были какие-то ограничения, связанные с размером строки

PS. И ф-я func в C/C++ должна быть объявлена как __stdcall (она же pascal), иначе ее никак не вызвать из PB.
...
Рейтинг: 0 / 0
19.03.2009, 10:03
    #35878374
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Раз пошла такая .....
Поясню.
1. Метод в DLL определен как __stdcall
2. С правилами передачи аргументов в методы DLL я несколько знаком. :)
ну кто не обрашался к Win API :(
3. Основная проблема в том, что я не знаю как описать аргумент метода (void **Arg)
Суть в том, что метод DLL func( void **Arg ) принимает адрес указателя на блок памяти
и преобразовывает это блок по своим правилам.
А вот как это описать (декларацию метода) я не могу понять, увы.
...
Рейтинг: 0 / 0
19.03.2009, 15:16
    #35879496
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Ау, народ!
Нет даже мыслей, не говоря уж о решении?
...
Рейтинг: 0 / 0
19.03.2009, 15:47
    #35879589
gy gy gy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Raven A,

sozdai svoiu dll wrapper dlia svoih nujd na cpp, potom iuzai iz pod PB.
...
Рейтинг: 0 / 0
19.03.2009, 16:29
    #35879766
18-я весна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Raven AАу, народ!
Нет даже мыслей, не говоря уж о решении?
В том виде, как вы описали задачу, решения нет.
Есть решения для частных случаев, но надо знать подробности.
Например структуру объекта на который передается указатель.
Или почему передается ссылка на указатель на объект, а не сам указатель.

DLL чужая или можно вносить изменения для реализации доступа из PB?
...
Рейтинг: 0 / 0
19.03.2009, 16:33
    #35879780
18-я весна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Также напишите, где создается объект - в DLL или в PB?
Какие ф-и для этого вызываются?
...
Рейтинг: 0 / 0
19.03.2009, 18:29
    #35880174
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
to 18-я весна

Уточняю.
DLL чужая, кода нет, есть дока и Lib.H
В Lib.DLL есть void func( void **Arg )
Метод шифрует блок памяти (для простоты строку).
Методу передается адрес указателя на строку.
В вызывающем коде (PB, C, C++ ...) нет никаких объектов, структур, коллекций etc.
Есть срока текста, которую надо зашифровать. Вот и ее надо передать методу func( void **Arg ).
Вопрос простой: как описать func( void **Arg ) в PB и как передать туда строку.
Все.
...
Рейтинг: 0 / 0
19.03.2009, 19:05
    #35880267
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
18-я веснаRaven AАу, народ!
Нет даже мыслей, не говоря уж о решении?
В том виде, как вы описали задачу, решения нет.
Есть решения для частных случаев, но надо знать подробности.
Например структуру объекта на который передается указатель.
Или почему передается ссылка на указатель на объект, а не сам указатель.

DLL чужая или можно вносить изменения для реализации доступа из PB?
Ну почему же, нет ничего не возможного. Только немного API вызовов придется подергать. Схематично:
Код: plaintext
1.
2.
3.
HeapCreate(...)
l=HeapAlloc(...)
func(l)
HeapDestroy(...)
func описать как
Код: plaintext
procedure func(ref uint Arg)
Я думаю, должно получиться.
...
Рейтинг: 0 / 0
19.03.2009, 19:56
    #35880323
18-я весна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
Raven Ato 18-я весна

Уточняю.
DLL чужая, кода нет, есть дока и Lib.H
В Lib.DLL есть void func( void **Arg )
Метод шифрует блок памяти (для простоты строку).
Методу передается адрес указателя на строку.
В вызывающем коде (PB, C, C++ ...) нет никаких объектов, структур, коллекций etc.
Есть срока текста, которую надо зашифровать. Вот и ее надо передать методу func( void **Arg ).
Вопрос простой: как описать func( void **Arg ) в PB и как передать туда строку.
Все.
Лично у меня возникли следующие вопросы, без ответа на которые я не вижу смысла решать главную техническую проблему - получения в PB числового значения указателя на строку PB.
Ф-я ожидает на входе строку с завершающим нулевым байтом? Если нет, то как она определяет длину блока памяти.
Длина результата шифрования такая же как и исходной строки?
Ф-я возвращает результат в том же блоке памяти или выделяет новый и возвращаает его адрес в аргументе?
Если выделяет новый, что происходит со старым? Кто отвечает за освобождение выделенной памяти, вызывающий или вызванный? Выделение происходит из кучи ОС или из локальной кучи C-Runtime?
Результат шифрования тоже текст или произвольный набор бинарных данных включая 0?
В PB надо получить результат в виде Blob или String ? Или результат не нужно извлекать в PB, т.к. он передается в следующую ф-ю этой библиотеки?

А сам указатель получить можно несколькими способами:
1) Написать DLL с функцией
Код: plaintext
char * __stdcall getPointer(char *s) { return s; }
и описать ее в PB:
Код: plaintext
Function ulong getPointer(ref string s) alias for "getPointer" library "utils"
2) Воспользоваться побочным эффектом ф-и lstrcpy или lstrcat из kernel32.dll
Код: plaintext
1.
2.
3.
Function ulong getPointer1(ref string as_s1, ref string as_s2) alias for "lstrcpy" library "kernel32"
Function ulong getPointer2(ref string as_s1, readonly string as_s2) alias for "lstrcat" library "kernel32"
ll_ptr = getPointer1(ref ls_text, ref ls_text)
ll_ptr = getPointer2(ref ls_text, "")
3) То что Марк предложил

При условии что работа идет со строками с завершающим нулем, и результат также строка и если забыть про выделение памяти, то можно делать так:
Код: plaintext
1.
2.
3.
subroutine func(ref ulong arg ) alias for "func" library "lib"
ll_ptr = getPointer2(ref ls_text, "")
func(ref ll_ptr)
ls_crypt = String(ll_ptr, "address")

Но я вам рекомендую создать DLL обертку на C/C++ и в ней все честно делать согласно интерфейса этой библиотеки. А результат передать в PB уже из своих ф-й как это будет удобно.
...
Рейтинг: 0 / 0
20.03.2009, 09:07
    #35880818
AIZ
AIZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
subroutine func(ref Blob arg ) library "lib.dll" или
subroutine func(ref String arg ) library "lib.dll"
...
Рейтинг: 0 / 0
20.03.2009, 10:49
    #35881055
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов API, void ** Arg
to Mark & to 18-весна
Идеи интересные, есть о чем подумать. Спасибо.
Спасибо за потраченное время.

to AIZ
>subroutine func(ref Blob arg ) library "lib.dll" или
>subroutine func(ref String arg ) library "lib.dll"
А вот разницу между void *Arg && void **Arg ощущаем?
Вы подумайте, что у Вас на стеке будет/должно лежать.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вызов API, void ** Arg / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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