Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.04;
Скачать: CL | DM;

Вниз

Возникает ошибка при обращении к функции из 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
1-9192
BVS
2002-02-13 17:52
2002.03.04
Перехват нажатия мышки.


4-9323
Alexey(Me)
2002-01-03 14:11
2002.03.04
E-Mail


1-9203
Анонимщик
2002-02-14 10:54
2002.03.04
Помогите с печатью метафайла


1-9150
Loxly
2002-02-17 14:22
2002.03.04
Выношу часть функциональности проги в DLL, но размер EXE шника НЕ УМЕНЬШАЕТСЯ.


1-9190
fag2000@ok.ru
2002-02-13 13:44
2002.03.04
Как узнать код возврата