Главная страница
    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.011 c
7-47857
Linx
2002-04-16 21:59
2002.07.15
Блокирование системных комбинаций клавиш.


1-47304
Ivan61
2002-06-30 21:47
2002.07.15
Ini или не Ini


7-47825
Hel
2002-04-22 15:23
2002.07.15
Как скрыть окно, появляющеееся после печати?


3-47220
!Daemon
2002-05-31 01:15
2002.07.15
Как определить тип столбца.


14-47707
Windeus
2002-06-18 00:30
2002.07.15
RXLibrary





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