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

Вниз

Ошибка при работе с DLL   Найти похожие ветки 

 
AFROLOV ©   (2002-06-28 11:43) [0]

Вызываю я функцию из DLL а мне выдается ошибка Invalid Pointer Operation.
Текст DLL:

library Service;

uses
SysUtils,
Classes;

{$R *.res}
function generateUID(len:Integer):String;export;stdCall;
var
i:integer;
tmp:integer;
begin
result:="";
for i:=1 to len*2 do
begin
tmp:=random(16);
result:=result+IntToHex(tmp,1);
end;
end;

exports generateUID;
begin
end.


Объявление:
function generateUID (len:integer): String; stdcall; external "Service.dll" name "generateUID";

Использование:
RichEdit1.Lines.Add(generateUID(10));
После выполнения этой строчки вылетает Exception. Как эту проблему можно снять? Заранее большое спасибо.


 
Skier ©   (2002-06-28 11:49) [1]

> AFROLOV



library Service;

uses
SysUtils,
Classes;

{$R *.res}
function generateUID(len:Integer):PChar; stdCall;
var
i:integer;
tmp:integer;
AResult : String;
begin
Result := nil;
AResult :="";
for i:=1 to len*2 do
begin
tmp:=random(16);
AResult :=AResult +IntToHex(tmp,1);
end;
Result := PChar(AResult);
end;

exports

generateUID index 1 name "generateUID";

begin
end.


Объявление:

function generateUID (len:integer): PChar; stdcall; external "Service.dll" name "generateUID";



 
Игорь Шевченко ©   (2002-06-28 11:50) [2]

Надо вдумчиво читать текст, который Delphi пишет при создании DLL. Еще лучше, выучить его наизусть. Текст касается строк и ShareMem.


 
AFROLOV ©   (2002-06-28 12:04) [3]

Спасибо.


 
oomneeq ©   (2002-06-28 12:50) [4]


var
...
AResult : String;
begin
Result := nil;
...
Result := PChar(AResult);
end

A вот из хелпа
A common error when working with PChars is to store in a data structure, or return as a value, a local variable. When your routine ends, the PChar will disappear because it is simply a pointer to memory, and is not a reference counted copy of the string. For example:

function title(n: Integer): PChar;

var
s: string;
begin
s := Format("title - %d", [n]);
Result := PChar(s); // DON"T DO THIS
end;

This example returns a pointer to string data that is freed when the title function returns.


 
Skier ©   (2002-06-28 13:04) [5]

>oomneeq
Спасибо. Это я не учёл.
А ежели использовать StrPCopy ?


 
panov ©   (2002-06-28 15:18) [6]

Совершенно спокойно можете использовать функцию в таком виде без переделок:
function generateUID(len:Integer): ShortString;export;stdCall;


 
Skier ©   (2002-06-28 15:32) [7]

>panov
А если параметр "len" будет > 128 ?


 
panov ©   (2002-06-28 15:41) [8]

"А если параметр "len" будет > 128 ?"
А зачем ему быть > 128?


 
Игорь Шевченко ©   (2002-06-28 15:45) [9]

Skier © (28.06.02 15:32)

Главное, чтобы не больше 255 :-)


 
Skier ©   (2002-06-28 15:49) [10]

>Игорь Шевченко
Ну дык, в коде len умножается на 2.
Вот я написал про 128...


 
Игорь Шевченко ©   (2002-06-28 15:50) [11]

Skier © (28.06.02 15:32)

Главное, чтобы не больше 255 :-)


 
panov ©   (2002-06-28 16:05) [12]

Тут 2 пути решения:
1. Ограничить Len
2. В программе выделять массив, например Array[0..2048] of Char
и передавать его как VAR-параметр в DLL, а в DLL заполнять.


 
Anatoly Podgoretsky ©   (2002-06-28 16:08) [13]

Все правильно, максимальное допустимое число, при котором не будет ошибки 127
Поэтому если использовать ShortString то требуется или проверка или или ограничение


 
Anatoly Podgoretsky ©   (2002-06-28 16:15) [14]

А решение простое, передавать нормальную длину строки и соответственно цикл будет такой for i:=1 to len вместо for i:=1 to len*2



Страницы: 1 вся ветка

Текущий архив: 2002.07.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-47283
Floyd
2002-06-30 11:43
2002.07.15
ListBox


14-47787
Дмитрий Баранов
2002-06-11 10:05
2002.07.15
Ленинградцы, помогите:)


6-47667
Dobriy
2002-05-02 13:55
2002.07.15
Проблема с двумя сетевыми картами


6-47647
ikivio
2002-04-24 23:06
2002.07.15
Proxy and E-mail


14-47732
z_z
2002-06-12 00:02
2002.07.15
У кого есть Variants.pas, пожалуйста вышлите killer@rfvnu.lg.ua