Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-9293
ABCDE
2002-01-16 12:07
2002.03.04
Про Аську


7-9316
Aza
2001-11-27 06:58
2002.03.04
Hook на клаву


1-9187
Termik
2002-02-14 15:14
2002.03.04
Отладчик Delphi


1-9193
kingdom
2002-02-14 15:38
2002.03.04
Как узнать, что форма минимизирована???


1-9237
dim2001
2002-02-13 19:48
2002.03.04
стандартный диалог





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский