powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вызов API, void ** Arg
13 сообщений из 13, страница 1 из 1
Вызов API, void ** Arg
    #35875993
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PB 9.03 Build 8836
Уважаемое сообщество!
Возникла проблема, которую пока не могу решить, посему прошу совета.
Есть некоторая Lib.DLL, в которой определен метод void func( void **Arg )
Вопрос:
Как описать этот метод в PB, а именно, как описать аргумент метода?
В паутине уже был, ничего, к сожалению, не нашел.
Заклинание Филиппа "Зачем?" не предлогать, DLL есть, к ней надо стучаться, увы.
...
Рейтинг: 0 / 0
Вызов API, void ** Arg
    #35876554
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объект по ссылке, более подробно может расказать либо Филипп, либо 18-я весна
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
Вызов API, void ** Arg
    #35877896
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотря на что возвращается указатель.
Общем случае - то, на что указывает указатель никак нельзя вернуть.
Но если интересует только значение самого указателя, то объявляйте так:
Код: 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
Вызов API, void ** Arg
    #35878374
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз пошла такая .....
Поясню.
1. Метод в DLL определен как __stdcall
2. С правилами передачи аргументов в методы DLL я несколько знаком. :)
ну кто не обрашался к Win API :(
3. Основная проблема в том, что я не знаю как описать аргумент метода (void **Arg)
Суть в том, что метод DLL func( void **Arg ) принимает адрес указателя на блок памяти
и преобразовывает это блок по своим правилам.
А вот как это описать (декларацию метода) я не могу понять, увы.
...
Рейтинг: 0 / 0
Вызов API, void ** Arg
    #35879496
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ау, народ!
Нет даже мыслей, не говоря уж о решении?
...
Рейтинг: 0 / 0
Вызов API, void ** Arg
    #35879589
gy gy gy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Raven A,

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

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

Уточняю.
DLL чужая, кода нет, есть дока и Lib.H
В Lib.DLL есть void func( void **Arg )
Метод шифрует блок памяти (для простоты строку).
Методу передается адрес указателя на строку.
В вызывающем коде (PB, C, C++ ...) нет никаких объектов, структур, коллекций etc.
Есть срока текста, которую надо зашифровать. Вот и ее надо передать методу func( void **Arg ).
Вопрос простой: как описать func( void **Arg ) в PB и как передать туда строку.
Все.
...
Рейтинг: 0 / 0
Вызов API, void ** Arg
    #35880267
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вызов API, void ** Arg
    #35880323
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вызов API, void ** Arg
    #35880818
Фотография AIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
subroutine func(ref Blob arg ) library "lib.dll" или
subroutine func(ref String arg ) library "lib.dll"
...
Рейтинг: 0 / 0
Вызов API, void ** Arg
    #35881055
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
13 сообщений из 13, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вызов API, void ** Arg
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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