Форум: "Основная";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];
ВнизВозникает ошибка при обращении к функции из DLL Найти похожие ветки
← →
GarT (2002-02-15 17:00) [0]Как исправить эту ситуацию
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;
← →
Иван Шихалев (2002-02-15 17:13) [1]Лучше бы все-таки как-нибудь между делом под PChar выделить-таки память.
← →
GarT (2002-02-15 18:34) [2]А поподробнее можно... примерчик написать. А то второй день бьюсь и ничего.
← →
Иван Шихалев (2002-02-15 18:41) [3]Гм... Кстати, а uses ShareMem не поможет часом? Честно говоря, ломает примерчики писать. С PChar вообще-то положено работать примерно так:
finction GetAnyString (Buffer :PChar; BufferSize :dword) :dword;
← →
GarT (2002-02-15 19:40) [4]Если бы я использовал ShareMem,то не сталбы мучаться с PChar и использовал String. Что меня здесь задело если функцию определить следующим образом
function average( a:REAL ):PChar;far;external "temp.dll";
то все проходит замечательно, а с PChar ничего не получается.
← →
Иван Шихалев (2002-02-15 21:15) [5]Да? И возвращать то же самое? Мб, приведещь реальную функцию?
← →
Petrovich (origin) (2002-02-15 22:12) [6]to Иван Шихалев ©
В данном случае память выделяет Delphi в DLL в момент присваивания результата.
to GarT
Ты все правильно написал, судя по исходникам. Конструкция должна работать. Может, ты приведешь текст ошибки. Тогда посмотрим.
← →
Иван Шихалев (2002-02-15 22:15) [7]> В данном случае память выделяет Delphi в DLL
> в момент присваивания результата.
В таком случае необходим ShareMem.
← →
GarT (2002-02-15 22:29) [8]to
Petrovich Текст ошибки пожалуйста:
"Project ... faulted with message: "access violation at 0x000001ba: read of adress 0x000001ba". Process stoped..."
To Иван Шихалев
Я бы согласился но судя по тексту комментария в DLL (который вставляется автоматом) все должнобыть нормально, если верить разработчикам делфи. исходную функцию я отправил на вашу почтую
← →
Petrovich (origin) (2002-02-15 22:58) [9]to Иван Шихалев ©
> В таком случае необходим ShareMem.
Если использовать не PChar.
to GarT
Информативно... %)
Может в процессе компиляции доступна одна temp.dll, а в run-time - другая. Все таки связывние статическое... Поищи по дискам.
← →
Иван Шихалев (2002-02-15 22:59) [10]to GarT
Сейчас как раз смотрю. Отвечу подробно завтра.
← →
Набережных С. (2002-02-15 23:37) [11]
> 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;
← →
MihNik (2002-02-16 00:34) [12]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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c