Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];

Вниз

Invalid Pointer Operation.   Найти похожие ветки 

 
Sheva   (2002-04-24 10:59) [0]

Помогите, пожалуйста, разобраться почему появляется exception.
Сбацал dll. Вот сокращенный исходник библиотеки:


library numconv;

uses
ShareMem, SysUtils, Classes, StrUtils;

{$R *.res}

Function OneLetter(st: string): string;
begin

end;

Function TwoLetter1(st: string): string;
begin

end;
end;

Function TwoLetter0(st: string): string;
begin

end;

Function ThreeLetter0(st: string): string;
begin

end;

Function FourLetter0(st: string): string;
begin
end;


Function GetTwoSymbols (st: string): string;
begin
if ((RightStr(st, 1) <> "0") and (LeftStr(st, 1) = "1")) then Result:= TwoLetter1(st);
if ((LeftStr(st, 1) <> "1") and (RightStr(st, 1) <> "0")) then Result:= TwoLetter0(leftstr(st,1)) + " " + OneLetter(RightStr(st,1));
if ((LeftStr(st, 1) <> "1") and (RightStr(st, 1) = "0")) then Result:= TwoLetter0(leftstr(st,1));
if st = "10" then Result:= "десять";
end;

Function GetThreeSymbols (st: string): string;
begin
if RightStr(st, 2) = "00" then Result:= ThreeLetter0(st);
if RightStr(st, 2) <> "00" then Result:= ThreeLetter0(st) + " " + GetTwoSymbols(RightStr(st, 2));
end;

Function GetFourSymbols (st: string): string;
begin
if RightStr(st, 3) = "000" then Result:= FourLetter0(st);
if RightStr(st, 3) <> "000" then Result:= FourLetter0(st) + " " + GetThreeSymbols(RightStr(st, 3));
end;

if MidStr(st, 2, 1) = "0" then Result:= FiveLetter0(st) + " " + GetThreeSymbols(RightStr(st,3));
if MidStr(st, 2, 1) <> "0" then Result:= FiveLetter1(st) + " " + GetThreeSymbols(RightStr(st, 3));
end;


Function ConvNumToString (str1: integer): string; stdcall;
var st: string;
begin
st:= IntToStr(str1);

case Length(trim(st)) of

1: Result:= OneLetter(st);
2: Result:= GetTwoSymbols(st);
3: Result:= GetThreeSymbols(st);
4: Result:= GetFourSymbols(st);
5: Result:= GetFiveSymbols(st);
6: Result:= GetSixSymbols(st);
7: Result:= GetSevenSymbols(st);
8: Result:= GetEightSymbols(st);
9: Result:= GetNineSymbols(st);

end;
end;

exports ConvNumToString;

begin
end.


Потом в проге вызываю эту процедурку из библиотеки:

unit Unit1;

interface

uses
ShareMem, Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;

implementation
Function ConvNumToString(str1: integer): string; stdcall; external "numconv.dll" name "ConvNumToString";


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var st: string;
begin
st:= ConvNumToString(1234);
ShowMessage(st);

end;

end.



Сначала ошибка возникала после вызова функции. Сама функция отрабатывала нормально. Возвращала результат, но после этого появлялась ошибка "Invalid pointer operation". Тогда я добавил в проект и в библиотеку ShareMem. Вроде все классно, заработало, но при выходе из приложения, опять стала появляться та же ошибка.

Что я сделал не так? Если кто знает, подскажите, пожалуйста.


 
Игорь Шевченко   (2002-04-24 11:26) [1]

День добрый,

А те функции, текст которых begin end, они результат какой-то
гарантировано возвращают ?
И функция ConvNumToString возвращает что-то, если в условия case не попадает ?

С уважением,


 
Sheva   (2002-04-24 11:38) [2]

Вот пример:
Function ThreeLetter0(st: string): string;
begin

case strtoint(leftstr(st,1)) of
1: Result:= "сто";
2: Result:= "двiстi";
3: Result:= "триста";
4: Result:= "чотириста";
5: Result:= "п" + #39 + "ятьсот";
6: Result:= "шiстьсот";
7: Result:= "сiмсот";
8: Result:= "вiсiмсот";
9: Result:= "дев" + #39 + "ятьсот";
end;

end;

Результат возвращают всегда. Так же, как и ConvNumToString. Дело в том, что я нормально вызываю функцию из библиотеки в своем проэкте. Она мне нормально показывает возвращенный результат. Но уже при выходе из приложения, где не обрабатывается ничего, происходит subj.

Если я не сапихиваю все эти функции в библиотеку, а подключаю их к своему проэкту отдельным юнитом, то все работает прекрассно.


 
Donal_Graeme   (2002-04-24 11:55) [3]

а если убрать ShareMem, а тип возвращаемого функцией ConvNumToStr результата String заменить на PChar?


 
Игорь Шевченко   (2002-04-24 12:01) [4]

День добрый,

Я бы посоветовал в каждую функцию в DLL, возвращающую String в начале поставить фразу
Result := "";

С уважением,


 
Sheva   (2002-04-24 12:11) [5]

Огромное спасибо Всем. Заработало, когда поменял на PChar.

Но все равно, как то странно. Это что, баг?


 
Donal_Graeme   (2002-04-24 13:37) [6]

всё-таки String типы - они не "native" типы виндов. поэтому лучше, имхо, всё-таки использовать PChar для тех строк, которые надо передавать как параметры или результаты экспортируемых функций.


 
Игорь Шевченко   (2002-04-24 15:41) [7]

День добрый, Donal_Graeme,


> всё-таки String типы - они не "native" типы виндов


Может, расскажете, каким боком это относится к связи между EXE и DLL, и у Borland"a (и у меня :-)))) все при этом работает со string ?

С уважением,


 
Donal_Graeme   (2002-04-24 17:53) [8]

честно говоря, я не мастер давать всякие объяснения.
я выразил лишь своё мнение, заключающееся в том, что в данном случае лучше использовать PChar.

Я не говорил, что String вообще работать не будет. но чтобы он работал приходится подключать борландовский менеджер памяти.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
1-26141
hooky-mars
2002-04-21 19:01
2002.05.09
Form&MessageBox


1-26144
Andreika
2002-04-24 22:24
2002.05.09
CreateProcess и все такое...


1-26049
Сатир
2002-04-23 14:53
2002.05.09
TreeView : Copy TreeNodes


3-25997
viru$
2002-04-15 17:17
2002.05.09
Проблемка с IBEvents


14-26263
IronHawk
2002-04-02 15:39
2002.05.09
Приветствую Мастеров ! Есть вопрос, мне надо сохранять дату из





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