Получение строки из DLL написаной на VS
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Получение строки из 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 и вызова функций могу привести, но это все то, что когда-то советовал Олег Руденко и я его частенко использовал. Правда еще не было выозвращаемых значение в виде строки)
Спасибо.
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
если я не туплю ... так пробовали ?
CSTR &CSTRING
CSTR &= MyFunc1()
MESSAGE(CSTR)
CSTR &CSTRING
CSTR &= MyFunc1()
MESSAGE(CSTR)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- ✯ Ветеран ✯
- Сообщения: 1014
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Получение строки из DLL написаной на VS
MyFunc1(*CSTRING, *CSTRING, *CSTRING), CSTRING?MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
Получение строки из DLL написаной на VS
Так же возвращает пустотуAdmin писал(а):если я не туплю ... так пробовали ?
CSTR &CSTRING
CSTR &= MyFunc1()
MESSAGE(CSTR)
- Admin
- Администратор
- Сообщения: 3960
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Получение строки из DLL написаной на VS
попробуйте
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Получение строки из DLL написаной на VS
Ну CSTRING - это всегда по адресу. Не прокатит...Ал писал(а):MyFunc1(*CSTRING, *CSTRING, *CSTRING), CSTRING?MyFunc1(*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.
Получение строки из DLL написаной на VS
Все пошло.Огромное спасибоAdmin писал(а):попробуйте
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
Получение строки из DLL написаной на VS
А можно поподробнее, что пошло и куда пошло? На мой взгляд предложенный прототип - абсолютная копия MyFunc2 из топика. Может я с мобильника что-то не вижу?
-------------------------------
В истинном золоте блеска нет...
В истинном золоте блеска нет...
Получение строки из DLL написаной на VS
Есть две функции в DLL (MyFunc1 и MyFunc2). Одна MyFunc1 возвращает строку, другая MyFunc2 некое числоAragorn писал(а):А можно поподробнее, что пошло и куда пошло? На мой взгляд предложенный прототип - абсолютная копия MyFunc2 из топика. Может я с мобильника что-то не вижу?
Я описал прототип MyFunc1, как
MyFunc1(*CSTRING, *CSTRING, *CSTRING), *CSTRING
и строка всегда возвращала пустоту.
Объявить прототип надо было так:
MyFunc1(*CSTRING, *CSTRING, *CSTRING), LONG
ну и использовать для получения строки, решение, которое подсказал Admin
Прототип же MyFunc2
MyFunc2(*CSTRING, *CSTRING, *CSTRING), LONG
Вот она без проблем возвращала некое число. Т.е. с MyFunc2 проблем не было