Страница 1 из 1
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 13:04
Леонид
Добрый день!
C6 9054 ABC
Есть DLL написанная на VS. В ней, скажем, есть функции MyFunc1 и MyFunc2. На входе 3 строковых параметра и возвращается строка и некое число, т.е. прототипы в клаше:
MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
MyFunc2(*CSTRING, *CSTRING, *CSTRING), LONG
DLL-ку грузим динамически и соответственно вызывает данные функции. Все как бы хорошо, НО если MyFunc2 (с возвращаемым типом LONG) всегда возвращает правильное значение, а FMyFunc1 (с возвращемым типом *CSTRING) всегда возвращает нулевую строку.
Не подскажет народ, куда смотреть (код динамической загрузки DLL и вызова функций могу привести, но это все то, что когда-то советовал Олег Руденко и я его частенко использовал. Правда еще не было выозвращаемых значение в виде строки)
Спасибо.
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 13:22
Admin
если я не туплю ... так пробовали ?
CSTR &CSTRING
CSTR &= MyFunc1()
MESSAGE(CSTR)
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 13:35
Ал
MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
MyFunc1(*CSTRING, *CSTRING, *CSTRING),
CSTRING?
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 14:05
Леонид
Admin писал(а):если я не туплю ... так пробовали ?
CSTR &CSTRING
CSTR &= MyFunc1()
MESSAGE(CSTR)
Так же возвращает пустоту
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 14:12
Admin
попробуйте
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 14:32
Леонид
Ал писал(а):MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
MyFunc1(*CSTRING, *CSTRING, *CSTRING),
CSTRING?
Ну CSTRING - это всегда по адресу. Не прокатит...
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 14:34
Ал
посмотрите 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.
Получение строки из DLL написаной на VS
Добавлено: 16 Апрель 2015, 16:20
Леонид
Admin писал(а):попробуйте
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
Все пошло.Огромное спасибо
Получение строки из DLL написаной на VS
Добавлено: 18 Апрель 2015, 0:11
Aragorn
А можно поподробнее, что пошло и куда пошло? На мой взгляд предложенный прототип - абсолютная копия MyFunc2 из топика. Может я с мобильника что-то не вижу?
Получение строки из DLL написаной на VS
Добавлено: 18 Апрель 2015, 11:18
Леонид
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 проблем не было