Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
ВнизОшибка при работе с 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c