Получение строки из DLL написаной на VS

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 17:07

Получение строки из DLL написаной на VS

Сообщение Леонид »

Добрый день!

C6 9054 ABC

Есть DLL написанная на VS. В ней, скажем, есть функции MyFunc1 и MyFunc2. На входе 3 строковых параметра и возвращается строка и некое число, т.е. прототипы в клаше:
MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
MyFunc2(*CSTRING, *CSTRING, *CSTRING), LONG

DLL-ку грузим динамически и соответственно вызывает данные функции. Все как бы хорошо, НО если MyFunc2 (с возвращаемым типом LONG) всегда возвращает правильное значение, а FMyFunc1 (с возвращемым типом *CSTRING) всегда возвращает нулевую строку.

Не подскажет народ, куда смотреть (код динамической загрузки DLL и вызова функций могу привести, но это все то, что когда-то советовал Олег Руденко и я его частенко использовал. Правда еще не было выозвращаемых значение в виде строки)

Спасибо.
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получение строки из DLL написаной на VS

Сообщение Admin »

если я не туплю ... так пробовали ?
CSTR &CSTRING
CSTR &= MyFunc1()
MESSAGE(CSTR)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Получение строки из DLL написаной на VS

Сообщение Ал »

MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
MyFunc1(*CSTRING, *CSTRING, *CSTRING), CSTRING?
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 17:07

Получение строки из DLL написаной на VS

Сообщение Леонид »

Admin писал(а):если я не туплю ... так пробовали ?
CSTR &CSTRING
CSTR &= MyFunc1()
MESSAGE(CSTR)
Так же возвращает пустоту
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получение строки из DLL написаной на VS

Сообщение Admin »

попробуйте
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 17:07

Получение строки из DLL написаной на VS

Сообщение Леонид »

Ал писал(а):
MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
MyFunc1(*CSTRING, *CSTRING, *CSTRING), CSTRING?
Ну CSTRING - это всегда по адресу. Не прокатит...
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Получение строки из DLL написаной на VS

Сообщение Ал »

посмотрите help раздел PROCEDURE Return Types, значение или указатель возвращает, если long - то address(MyF... ?
...
An untyped value-parameter return value (?) indicates the data type of the value returned by the PROCEDURE is not known. This functions in exactly the same manner as an untyped value-parameter. When the value is returned from the PROCEDURE, standard Clarion Data Conversion Rules apply, no matter what data type is returned.
Variable RETURN types:
CSTRING *STRING *BYTE *SHORT *USHORT *LONG *ULONG *SREAL *REAL *DATE *TIME
Untyped variable-parameter (*?)
Variable return types are provided just for prototyping external library functions (written in another language) which return only the address of data--they are not valid for use on Clarion language procedures.
Functions which return pointers (the address of some data) should be prototyped with an asterisk prepended to the return data type (except CSTRING). The compiler automatically handles the returned pointer at runtime. Functions prototyped this way act just like a variable defined in the program--when the function is used in Clarion code, the data referenced by the returned pointer is automatically used. This data can be assigned to other variables, passed as parameters to procedures, or the ADDRESS function may return the address of the data.
CSTRING is an exception because all the others are fixed length datums, and a CSTRING is not. So, any C function that returns a pointer to a CSTRING can be prototyped as "char *" at the C end, but the compiler thunks the procedure and copies the datum onto the stack. Therefore, just like the other pointer return values, when the function is used in Clarion code the data referenced by the returned pointer is automatically used (the pointer is dereferenced).
As an example of this, assume that the XYZ() function returns a pointer to a CSTRING, CStringVar is a CSTRING variable, and LongVar is a LONG variable. The simple Clarion assignment statement, CStringVar = XYZ(), places the data referenced by the XYZ() function's returned pointer, in the CStringVar variable. The assignment, LongVar = ADDRESS(XYZ()), places the memory address of that data in the LongVar variable.
An untyped variable-parameter return value (*?) indicates the data type of the variable returned by the PROCEDURE is not known. This functions in exactly the same manner as an untyped variable-parameter.
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 17:07

Получение строки из DLL написаной на VS

Сообщение Леонид »

Admin писал(а):попробуйте
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
Все пошло.Огромное спасибо
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

Получение строки из DLL написаной на VS

Сообщение Aragorn »

А можно поподробнее, что пошло и куда пошло? На мой взгляд предложенный прототип - абсолютная копия MyFunc2 из топика. Может я с мобильника что-то не вижу?
-------------------------------
В истинном золоте блеска нет...
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 17:07

Получение строки из DLL написаной на VS

Сообщение Леонид »

Aragorn писал(а):А можно поподробнее, что пошло и куда пошло? На мой взгляд предложенный прототип - абсолютная копия MyFunc2 из топика. Может я с мобильника что-то не вижу?
Есть две функции в DLL (MyFunc1 и MyFunc2). Одна MyFunc1 возвращает строку, другая MyFunc2 некое число
Я описал прототип MyFunc1, как
MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
и строка всегда возвращала пустоту.

Объявить прототип надо было так:
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
ну и использовать для получения строки, решение, которое подсказал Admin


Прототип же MyFunc2
MyFunc2(*CSTRING, *CSTRING, *CSTRING), LONG
Вот она без проблем возвращала некое число. Т.е. с MyFunc2 проблем не было
Ответить