Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-19668
KIR
2003-03-17 23:04
2003.04.07
Разноцветный Node.Text в TreeView. Может кто знает как?


1-19624
Soft
2003-03-25 13:12
2003.04.07
Шестнадцатеричный EDIT


6-19726
TButton
2003-02-13 18:07
2003.04.07
СерверСокет


14-19858
Kolya almaty
2003-03-21 16:31
2003.04.07
про си


14-19872
Lex(unreg)
2003-03-21 20:44
2003.04.07
Как грузить Jpeg в Image???





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