![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возникает ошибка при обращении к функции из DLL [D5, Win2k]
GarT © (2002-02-15 17:00:00)Как исправить эту ситуацию
Dll:
library temp;
uses
SysUtils,
Classes;
{$R *.RES}
function average(a:PChar):PChar;export;stdcall;
begin
result:="s";
end;
exports
average;
begin
end.
Текст программы:
…
implementation
function average(a:PChar):PChar;far;external "temp.dll";
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
sa:string;
begin
sa:=average("6"); //ОШИБКА!!!
Showmessage(sa);
end;
MihNik (2002-02-16 00:34:00) [1]IMHO ShareMem нужна только для передачи в качестве параметров строк в дельфи-типах. В данном случае достаточно выделить память под ту переменную, которую хочешь использовать...
Вот как это примерно будет выглядеть:
Dll:
library temp;
uses
SysUtils,
Classes;
{$R *.RES}
function average(a:PChar):PChar;export;stdcall;
begin
result:="s";
end;
exports
average;
begin
end.
Текст программы:
…
implementation
function average(a:PChar):PChar;far;external "temp.dll";
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
// sa : string;
sa : PChar;
begin
sa := StrAlloc(255);
или
GetMem(sa, 255);
sa := average("6");
Showmessage(sa);
strDispose(sa);
или
FreeMem(sa, 255);
end;
Набережных С. (2002-02-15 23:37:00) [2]
> Petrovich (origin) (15.02.02 22:12)
> to Иван Шихалев ©
> В данном случае память выделяет Delphi в DLL в момент присваивания
> результата.
Да ну? По-моему result указывает на константу "s". А ее судьба туманна...
> GarT © (15.02.02 18:34)
Примерно так:
library temp;
uses
SysUtils,
Classes;
{$R *.RES}
function average(a:PChar; var Count: integer):bool;stdcall;
begin
result := Length("str") < Count;
if result then
begin
StrPCopy(a,"str");
Count:=Length("str");
end else
Count:=Length("str")+1;
end;
exports
average;
begin
end.
Текст программы:
......
implementation
function average(a:PChar; var Count: integer):bool;stdcall;external "temp.dll";
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
sa:string;
n:integer;
begin
n:=0;
average(PChar(sa),n);
SetLength(sa,n);
average(PChar(sa),n);
Showmessage(sa);
end;
Иван Шихалев (2002-02-15 22:59:00) [3]to GarT
Сейчас как раз смотрю. Отвечу подробно завтра.
Petrovich (origin) (2002-02-15 22:58:00) [4]to Иван Шихалев ©
> В таком случае необходим ShareMem.
Если использовать не PChar.
to GarT
Информативно... %)
Может в процессе компиляции доступна одна temp.dll, а в run-time - другая. Все таки связывние статическое... Поищи по дискам.
GarT (2002-02-15 22:29:00) [5]to
Petrovich Текст ошибки пожалуйста:
"Project ... faulted with message: "access violation at 0x000001ba: read of adress 0x000001ba". Process stoped..."
To Иван Шихалев
Я бы согласился но судя по тексту комментария в DLL (который вставляется автоматом) все должнобыть нормально, если верить разработчикам делфи. исходную функцию я отправил на вашу почтую
Иван Шихалев (2002-02-15 22:15:00) [6]> В данном случае память выделяет Delphi в DLL
> в момент присваивания результата.
В таком случае необходим ShareMem.
Petrovich (origin) (2002-02-15 22:12:00) [7]to Иван Шихалев ©
В данном случае память выделяет Delphi в DLL в момент присваивания результата.
to GarT
Ты все правильно написал, судя по исходникам. Конструкция должна работать. Может, ты приведешь текст ошибки. Тогда посмотрим.
Иван Шихалев (2002-02-15 21:15:00) [8]Да? И возвращать то же самое? Мб, приведещь реальную функцию?
GarT (2002-02-15 19:40:00) [9]Если бы я использовал ShareMem,то не сталбы мучаться с PChar и использовал String. Что меня здесь задело если функцию определить следующим образом
function average( a:REAL):PChar;far;external "temp.dll";
то все проходит замечательно, а с PChar ничего не получается.
Иван Шихалев (2002-02-15 18:41:00) [10]Гм... Кстати, а uses ShareMem не поможет часом? Честно говоря, ломает примерчики писать. С PChar вообще-то положено работать примерно так:
finctionGetAnyString (Buffer :PChar; BufferSize :dword) :dword;
GarT (2002-02-15 18:34:00) [11]А поподробнее можно... примерчик написать. А то второй день бьюсь и ничего.
Иван Шихалев (2002-02-15 17:13:00) [12]Лучше бы все-таки как-нибудь между делом под PChar выделить-таки память.