Форум: "Основная";
Текущий архив: 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