![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пресловутые PChar и DLL... [D2005, XP]
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?