Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c