|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
PB 9.03 Build 8836 Уважаемое сообщество! Возникла проблема, которую пока не могу решить, посему прошу совета. Есть некоторая Lib.DLL, в которой определен метод void func( void **Arg ) Вопрос: Как описать этот метод в PB, а именно, как описать аргумент метода? В паутине уже был, ничего, к сожалению, не нашел. Заклинание Филиппа "Зачем?" не предлогать, DLL есть, к ней надо стучаться, увы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2009, 11:12 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
Объект по ссылке, более подробно может расказать либо Филипп, либо 18-я весна ----------------------------------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2009, 13:33 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
Смотря на что возвращается указатель. Общем случае - то, на что указывает указатель никак нельзя вернуть. Но если интересует только значение самого указателя, то объявляйте так: Код: plaintext 1.
При этом если возвращается указатель на строку с завершающим нулем, то получить ее можно будет так: Код: plaintext
PS. И ф-я func в C/C++ должна быть объявлена как __stdcall (она же pascal), иначе ее никак не вызвать из PB. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2009, 21:50 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
Раз пошла такая ..... Поясню. 1. Метод в DLL определен как __stdcall 2. С правилами передачи аргументов в методы DLL я несколько знаком. :) ну кто не обрашался к Win API :( 3. Основная проблема в том, что я не знаю как описать аргумент метода (void **Arg) Суть в том, что метод DLL func( void **Arg ) принимает адрес указателя на блок памяти и преобразовывает это блок по своим правилам. А вот как это описать (декларацию метода) я не могу понять, увы. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 10:03 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
Ау, народ! Нет даже мыслей, не говоря уж о решении? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 15:16 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
Raven A, sozdai svoiu dll wrapper dlia svoih nujd na cpp, potom iuzai iz pod PB. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 15:47 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
Raven AАу, народ! Нет даже мыслей, не говоря уж о решении? В том виде, как вы описали задачу, решения нет. Есть решения для частных случаев, но надо знать подробности. Например структуру объекта на который передается указатель. Или почему передается ссылка на указатель на объект, а не сам указатель. DLL чужая или можно вносить изменения для реализации доступа из PB? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 16:29 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
Также напишите, где создается объект - в DLL или в PB? Какие ф-и для этого вызываются? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 16:33 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
to 18-я весна Уточняю. DLL чужая, кода нет, есть дока и Lib.H В Lib.DLL есть void func( void **Arg ) Метод шифрует блок памяти (для простоты строку). Методу передается адрес указателя на строку. В вызывающем коде (PB, C, C++ ...) нет никаких объектов, структур, коллекций etc. Есть срока текста, которую надо зашифровать. Вот и ее надо передать методу func( void **Arg ). Вопрос простой: как описать func( void **Arg ) в PB и как передать туда строку. Все. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 18:29 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
18-я веснаRaven AАу, народ! Нет даже мыслей, не говоря уж о решении? В том виде, как вы описали задачу, решения нет. Есть решения для частных случаев, но надо знать подробности. Например структуру объекта на который передается указатель. Или почему передается ссылка на указатель на объект, а не сам указатель. DLL чужая или можно вносить изменения для реализации доступа из PB? Ну почему же, нет ничего не возможного. Только немного API вызовов придется подергать. Схематично: Код: plaintext 1. 2. 3.
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 19:05 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#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
Код: plaintext
Код: plaintext 1. 2. 3.
При условии что работа идет со строками с завершающим нулем, и результат также строка и если забыть про выделение памяти, то можно делать так: Код: plaintext 1. 2. 3.
Но я вам рекомендую создать DLL обертку на C/C++ и в ней все честно делать согласно интерфейса этой библиотеки. А результат передать в PB уже из своих ф-й как это будет удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2009, 19:56 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
subroutine func(ref Blob arg ) library "lib.dll" или subroutine func(ref String arg ) library "lib.dll" ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2009, 09:07 |
|
Вызов API, void ** Arg
|
|||
---|---|---|---|
#18+
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 ощущаем? Вы подумайте, что у Вас на стеке будет/должно лежать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2009, 10:49 |
|
|
start [/forum/search_topic.php?author=webcreative&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
get settings: |
9ms |
get forum list: |
11ms |
get settings: |
10ms |
get forum list: |
15ms |
get settings: |
9ms |
get forum list: |
17ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 1736ms |
total: | 1989ms |
0 / 0 |