Главная страница
    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.48 MB
Время: 0.011 c
7-47814
konusov
2002-04-02 00:44
2002.07.15
Программно выключить компьютер


1-47526
PETR
2002-07-04 15:21
2002.07.15
Привет народ !


3-47197
GrEG
2002-06-11 09:30
2002.07.15
Ограничение на длину индексируемого поля DBASE


3-47169
Adventure
2002-06-13 16:58
2002.07.15
Бред сивой кобылы........................


1-47343
PTE
2002-06-27 14:10
2002.07.15
RadioButton -ы и RadioGroup





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