Главная страница
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.011 c
1-47442
DenNNis
2002-07-03 11:31
2002.07.15
Excel ???


1-47298
TPavel
2002-06-30 22:41
2002.07.15
Открытие чужой программы.


14-47710
agrig
2002-06-18 21:09
2002.07.15
как 1С v.6 записывает свои файлы и чем сжимает?


1-47415
Солер
2002-07-02 21:51
2002.07.15
Как программе запретить выполнять действие


1-47378
MPro
2002-07-02 12:48
2002.07.15
Позарез надо изменить размер ячеек и сделать рамку в Excel!!