Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-47810
abitur
2002-06-16 20:48
2002.07.15
Win2K


1-47373
FireWorks
2002-07-01 16:34
2002.07.15
Работа с dll


1-47382
sh_a
2002-07-02 10:10
2002.07.15
Как записать динамический массив в файл?


3-47225
RDA
2002-06-20 12:04
2002.07.15
Компоненты FBIPlus


1-47314
SDv-503
2002-07-01 00:17
2002.07.15
Как программно нажать на .... (+)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский