Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-26165
d_oleg
2002-04-25 10:48
2002.05.09
Application Icon


1-26137
HDD
2002-04-24 15:04
2002.05.09
люди добрые помогите


3-26031
Socrat
2002-04-15 05:14
2002.05.09
Как подключиться к Access у зная только имя файла


3-26014
supervisor
2002-04-16 10:32
2002.05.09
Как снести BDE


3-26019
Начинающая
2002-04-16 14:07
2002.05.09
Глупый вопрос