Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

строки из DLL


starling13 ©   (2005-10-23 00:09:00) 

Помогите, пожалуйста.
Есть DLL на с. В нём функция, что-то типа:

extern "C" __export void Func1(char * String1, char * String2)
{
string1[0] = 'a'; string1[1] = '\x0';
string2[0] = 'b'; string2[1] = '\x0';
}


Вызываю из программы на Delphi:

...
procedure Func1(String1: PChar; String2: PChar); external 'My.dll' name '_Func1';
...
var String1, String2: string;
...
Func1(PChar(String1), PChar(String2));
...


String1 получает своё значение, а на операции со String2 Access violation...


starling13   (2005-10-23 16:46:00) [1]

Так, бросаю слепые эксперименты и в библиотеку...


Lamer@fools.ua   (2005-10-23 15:38:00) [2]

>> starling13 ©   (23.10.05 13:35) [9]

Верно. Строки есть. Память под них выделена. Только у этой памяти нету атрибута PAGE_WRITE (или как там его) ибо строки константные. Посему писАть туда низзя.


starling13   (2005-10-23 13:35:00) [3]

[1] - так ведь в [4] строки есть и имеют длину 2, значит есть куда писать?..


Lamer@fools.ua   (2005-10-23 13:31:00) [4]

>> isasa ©   (23.10.05 13:18) [5]

extern "C", насколько я помню, отключает name mangling.

>> starling13 ©   (23.10.05 12:49) [4]

[1] упорно игнорируете? Ну тогда успехов.


starling13   (2005-10-23 13:31:00) [5]

Но функция Func1 выполняет и другие действия (выводит модальное окно), которые налицо.


isasa   (2005-10-23 13:19:00) [6]

Сорри,
_Func1 -> _Func1@64 (2x32=64) ?????


isasa   (2005-10-23 13:18:00) [7]

А ты уверен, что в DLL есть точка входа Func1, а не  Func1@64?
Другими словами, см *.DEF файл.


starling13   (2005-10-23 12:49:00) [8]

Что-то не то... Вот так тоже не работает:
...
procedure Func1(String1: PChar; String2: PChar); external 'My.dll' name '_Func1';
...
var String1, String2: string;
...
String1 := 'aa';
String2 := 'bb';
...
Func1(PChar(String1), PChar(String2));
...

А если
procedure Func1(String1: PChar; String2: PChar); cdecl; external 'My.dll' name '_Func1';
то сразу AV


Lamer@fools.ua   (2005-10-23 12:24:00) [9]

Кстати.

> __export
Это, вроде, вообще не поддерживается в Win32. Это из Win16.


isasa   (2005-10-23 09:17:00) [10]

Вызывай

...
procedure Func1(String1: PChar; String2: PChar); cdecl;


Lamer@fools.ua   (2005-10-23 00:20:00) [11]

Где выделение памяти?


Наверх

Титульная страница Поиск, карта сайта Написать письмо