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

Вниз

Invalid Pointer operation при работе с функцией.?   Найти похожие ветки 

 
Matvey ©   (2003-03-26 23:43) [0]

Выручайте, не могу разобраться с внешними фунциями , т.е функция в DLL, должна возвратить строку, казалось бы чего проще. Все нормально отрабатывает даже результат выдает после чего сразу Invalid Pointer operation, хотя указатели в моем случае и рядом не лежали!?

Вот кусок кода DLL

unit GUDSP_Lib;

interface

uses
Windows, Messages, SysUtils, Classes, fCtrls, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

Function Taloni(Sender: String;Flag: Boolean;Kol_Tal: Integer):String; export; stdcall;
implementation

{$R *.DFM}
Function Taloni(Sender: String; Flag: Boolean; Kol_Tal: Integer):String; export; stdcall;

var
Talon: string;
Talon_Mas: Array of string;
t, i, Temp_Str, CH: integer;
begin
Talon:=Sender;
if ((Flag<>False)And(length(Talon)>=7)) then Begin
t:=Round((length(Talon)+1)/8);
SetLength(Talon_Mas,t);
For i:=0 to (t-1) do begin
Temp_Str:=length(Talon);
CH:=pos(",",Talon);
if ((CH<>8) AND (Temp_Str<>7)) Then begin
Finalize(Talon_Mas);
Abort;
end;
Talon_Mas[i]:=copy(Talon,1,7);
Delete(Talon,1,8);
END;

End
else begin
Talon:=Sender;
if length(Talon)<7 Then begin
Talon_Mas:= nil;
Abort;
end;
SetLength(Talon_Mas,Kol_Tal);
for i:=0 to (Kol_Tal-1) do begin
Talon_Mas[i]:=IntToStr(StrToInt(Talon)+i);
end;
end;
i:=Length(Talon_Mas);
Talon:="";
for t:=0 to i-1 do begin
if (t=(i-1)) then Talon:=Talon + Talon_Mas[t]
else
Talon:=Talon + Talon_Mas[t]+ ", ";

end;
Result:=Talon; //Может собака здесь порылась?

end;
end.


Суть не в том даже что она делает, а в том что она некорректно закрывается или возвращает результат, (с DLL ранее никогда не сталкивался), если эту же фунцию поместить в основной модуль программы все работает нормально, но я иду на принцип функция ДОЛЖНА КОРРЕКТНО ВЫЗЫВАТЬСЯ ИЗ DLL (причем подобная реализация поцедур в DLL работает также корректно). Помогите.


 
oomneeq ©   (2003-03-26 23:53) [1]

uses
Sharemem, //на 1м месте! и в приложении и в длл
...
//остальные юниты

+
таскать с собой борландовский менеджер памяти - borlndmm.dll

а когда ты создавал dll-проект,
дельфи тебе любезно ставило добрых 15 строк комментариев,
где как раз про ЭТО.
Ты бы прочел...

Успехов в (не)наступании на древние грабли!






 
Palladin ©   (2003-03-26 23:53) [2]

ненадежных мест здесь выше крыши...
но меня одно выражение прикололо

if (Flag<>False)and

ужасно...
надо учится культуре кодирования...

по поводу dll
а SharedMem у тебя в Uses стоит?


 
Matvey ©   (2003-03-27 00:14) [3]

До культуры тут далеко, дело в том что очень торопят и нужен результат поэтому кодим без оптимизации так прозрачней код.
Все что Вы предложили я добавил появилась ошибка друго плана, но ее попытаюсь решить сам. А вот еще вопрос на засыпку как зделать так чтобы функция возвращала массив.

Function DDD(bla, bla): Array of string; - не работает.
Обявляем тип:
Type MyType=Array of string;

Function DDD(bla, bla): MyType;
var
MYMas:MyType;
begin
SetLength(MYMas,100);
MYMas[0]:="werwre";
..
MYMas[99]:="werwre";

result:=MYMas; //Корректно ли это
end;





 
Matvey ©   (2003-03-27 00:23) [4]

ДОПОЛНЕНИЕ ошибка довольно гадкая, функция работает корректно, а вот выход из программы вызывает общеизвестное "Программа выполнила недопустимую...." причем закрыть это невозможно. Чувствую что-то где-то не освободилось до конца? Подскажите?


 
Palladin ©   (2003-03-27 01:00) [5]

вполне корректно, на мой взгляд, но лучьше всетаки зделать так, ибо я могу ошибаться...

procedure ddd(bla,bla; var MyMas:MyType);
begin
SetLength(MYMas,100);
MYMas[0]:="werwre";
..
MYMas[99]:="werwre";
end;



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

Текущий архив: 2003.04.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
14-19775
DeMoN-777
2003-03-21 16:30
2003.04.07
Cgi


4-19920
xZero
2003-02-09 00:15
2003.04.07
PE


1-19611
АлеКо
2003-03-25 09:08
2003.04.07
Работа с CharToOEM


1-19666
Soft
2003-03-18 16:12
2003.04.07
Области видимости модулей или перезагрузка методов


14-19866
NetBreaker666
2003-03-21 20:23
2003.04.07
Люди, у кого есть Lingvo - зацентие перефод слова FUBAR.