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

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

Пресловутые PChar и DLL... [D2005, XP]


Страницы:   1 2

GL00m ©   (2007-04-12 19:38:00) 

Лазил в поиск, не нашел.
Задача: в длл есть функция которая получает PChar, записывает в него данные и возвращает обратно вместе с результатом работы (Integer).
Код в длл:

function GetData(data:PChar):Integer;stdcall;
begin
 StrLCopy(data,'XXX',5);
 Result := 1;
end;
...
exports
 GetData index 1 name 'GetData';
begin
end.

Код в программе:

type
 TMyGetData = function(data:PChar):integer;
 ...
 CPlugins = class
 ...
 function DllGetData(data:PChar):Integer;

implementation
function CPlugins.DllGetData(data:PChar): Integer;
var
 h : Integer;
 f : TMyGetData;
begin
 Result := 0;
 h := LoadLibrary(PChar(DllFile));
 @f := GetProcAddress(h,'GetData');
 Result := f(data);
 FreeLibrary(h);
end;

Ну и потом вызов:

d : String;
pd : PChar;
R : Integer;

d := 'yyy';
pd := PChar(d);
R := Plugins.DllGetData(pd);

Ожидается, что в итоге в pd будет 'XXX'. Ан нет, там все тот же 'yyy', хотя в R содержится любое число, которое я задам в длл-ке.
На момент передачи data в функцию f, ее адрес равен адресу pd, но при попытке вывести содержимого data из dll, получаю бред, т.е. единственный вывод, который я смог сделать, что в dll передается не тот адрес. В чем я не прав???


ЮЮ   (2007-04-13 11:54:00) [21]

d := 'yyy';

Думаешь теперь имеешь три байта памяти с которыми можешь делать что хочешь? Ошибаешься.
Выдели явным образом нужный буфер памяти, а затем уж используй.


GL00m   (2007-04-13 11:40:00) [22]


> а какую длину имеет строка d перед приведением ее к PChar?
>  Т.е. на область памяти какого размера указывает pd?

d := 'yyy';
pd := PChar(d);

По-моему оно?

> function GetData(var data:PChar):Integer;stdcall;

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

> так это вообще фрипаскаль :)

Извините, не понял, к чему это...

> TMyGetData = function(data:PChar):integer;stdcall;

Действительно, получаю аксес вайолэйшин.

> Все-равно AV словит (должен словить, если все правильно
> сделает)

А что мне делать? Мне нужно просто из функции в длл-ке получить строку и целое. А выходит так, что целое я получаю нормально, а ПЧар, который я туда передаю, в функцию уже приходит не тот, что был изначально, соответственно, на выходе ничего не меняется...


Loginov Dmitry   (2007-04-13 08:07:00) [23]

Все-равно AV словит (должен словить, если все правильно сделает)


trubin   (2007-04-12 20:31:00) [24]


> type
>  TMyGetData = function(data:PChar):integer;


TMyGetData = function(data:PChar):integer; stdcall;


umbra   (2007-04-12 20:01:00) [25]

так это вообще фрипаскаль :)
http://www.freepascal.org/docs-html/rtl/sysutils/strlcopy.html


trubin   (2007-04-12 20:01:00) [26]


> function GetData(data:PChar):Integer;stdcall;

function GetData( vardata:PChar):Integer;stdcall;


umbra   (2007-04-12 19:54:00) [27]

а какую длину имеет строка dперед приведением ее к PChar? Т.е. на область памяти какого размера указывает pd?


Страницы:   1 2

Наверх

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