![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при работе с DLL [D6, Win2k]
AFROLOV © (2002-06-28 11:43:00)Вызываю я функцию из 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. Как эту проблему можно снять? Заранее большое спасибо.
Anatoly Podgoretsky (2002-06-28 16:15:00) [1]А решение простое, передавать нормальную длину строки и соответственно цикл будет такой for i:=1 to len вместо for i:=1 to len*2
Anatoly Podgoretsky (2002-06-28 16:08:00) [2]Все правильно, максимальное допустимое число, при котором не будет ошибки 127
Поэтому если использовать ShortString то требуется или проверка или или ограничение
panov (2002-06-28 16:05:00) [3]Тут 2 пути решения:
1. Ограничить Len
2. В программе выделять массив, например Array[0..2048] of Char
и передавать его как VAR-параметр в DLL, а в DLL заполнять.
Игорь Шевченко (2002-06-28 15:50:00) [4]Skier © (28.06.02 15:32)
Главное, чтобы не больше 255 :-)
Skier (2002-06-28 15:49:00) [5]>Игорь Шевченко
Ну дык, в коде len умножается на 2.
Вот я написал про 128...
Игорь Шевченко (2002-06-28 15:45:00) [6]Skier © (28.06.02 15:32)
Главное, чтобы не больше 255 :-)
panov (2002-06-28 15:41:00) [7]"А если параметр "len" будет > 128 ?"
А зачем ему быть > 128?
Skier (2002-06-28 15:32:00) [8]>panov
А если параметр "len" будет > 128 ?
panov (2002-06-28 15:18:00) [9]Совершенно спокойно можете использовать функцию в таком виде без переделок:
functiongenerateUID(len:Integer): ShortString;export;stdCall;
Skier (2002-06-28 13:04:00) [10]>oomneeq
Спасибо. Это я не учёл.
А ежели использовать StrPCopy ?
oomneeq (2002-06-28 12:50:00) [11]
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.
AFROLOV (2002-06-28 12:04:00) [12]Спасибо.
Игорь Шевченко (2002-06-28 11:50:00) [13]Надо вдумчиво читать текст, который Delphi пишет при создании DLL. Еще лучше, выучить его наизусть. Текст касается строк и ShareMem.
Skier (2002-06-28 11:49:00) [14]> 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";