Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по DLL   Найти похожие ветки 

 
Delph   (2002-06-18 10:16) [0]

Использую sharemem, при выходе из программы вылетает исключение.
В DLL в одном из функций создаю Table, но перед завершением работы с DLL другой функцией его освобождаю. Кроме того передаю параметрами и результатами функций строки. Что неправильно?
Вырезки кода:

unit UnitDLL;

interface

Uses classes;

function _Connect(StorigeName: String): boolean; export; stdcall;
function _DisConnect: boolean; export; stdcall;
.....
function _GetForm(IdObject: LongInt;
FormName,
FormDate: String): String; export; stdcall;
.....
function _GetLastError: String; export; stdcall;

implementation

uses
sharemem,
SysUtils,
DB,
VKDBFDataSet,
dialogs;

var
Table: TVKDBFNTX;
LastError: String;

function _Connect(StorigeName: String): boolean; stdcall;
begin
Result := True;
Table := TVKDBFNTX.Create(nil);
Table.AccessMode.AccessMode := 66;
Table.BufferSize := 8192;
Table.DBFFileName := StorigeName;
try
Table.Active := True;
except
on E: Exception do
begin
LastError := "Error connect to " + StorigeName;
Result := false;
end;
end;
end;

function _DisConnect: boolean; stdcall;
begin
Result := False;
try
Table.Active := False;
Table.Free;
Result := True;
except
LastError := "Error disconnect";
end;
end;

function _GetForm(IdObject: LongInt; FormName: String; FormDate: String): String;
begin
Result := "";
if Table.Locate("IDOBJECT;FORMNAME", VarArrayOf([IdObject, FormName]), [loPartialKey]) then
begin
try
if StrToDate(FormDate) = StrToDate(Table.FieldByName("DATE").AsString) then
Result := Table.FieldByName("DFM").AsString;
except
LastError := "Error date format";
end;
end;
end;

function _GetLastError: String;
begin
Result := LastError;
end;

exports
_Connect,
_DisConnect,
_GetForm,
_GetLastError;

end.


 
Игорь Шевченко   (2002-06-18 10:30) [1]

Знать бы, что за зверь TVKDBFNTX :-)))


 
Delph   (2002-06-18 10:44) [2]

Пробовал с обычным TTable, ситуация та же.


 
Игорь Шевченко   (2002-06-18 10:49) [3]

Delph (18.06.02 10:44)

Sharemem в EXE и в DLL первым unit"ом указан ?


 
Delph   (2002-06-18 10:56) [4]

Да.
Может в exe что то не так?

....
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button4Click(Sender: TObject);
private
Connect: function (StorigeName: String): boolean; stdcall;
DisConnect: function : boolean; stdcall;
...
GetForm: function (IdObject: LongInt;
FormName,
FormDate: String): String; stdcall;
iLib:HMODULE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
begin
iLib:=LoadLibrary("c:\storige\storige.dll");
Connect := GetProcAddress(iLib,"_Connect");
S := "c:\storige\FORMS.dbf";
Connect(S);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
P: String;
begin
@GetForm := GetProcAddress(iLib,"_GetForm");
P := GetForm(3, "FORM", DateToStr(Now));
ShowMessage(P);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DisConnect;
FreeLibrary(iLib);
end;


 
Игорь Шевченко   (2002-06-18 11:06) [5]

На первый взгляд, вроде правильно...

Что отладчик говорит ?


 
Delph   (2002-06-18 11:18) [6]

Игорь, я понял, самому смешно... Функцию DisConnect не проинициализировал :) Спасибо.


 
Игорь Шевченко   (2002-06-18 11:22) [7]

Я думал, ее инициализация находится в многоточиях, поэтому не стал заострять на этом внимание



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

Форум: "Основная";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
4-1253
V_V
2002-05-03 02:18
2002.07.01
menu


7-1214
Фредди
2002-03-30 20:56
2002.07.01
Блокировать клавиатуру


14-1190
Snap
2002-05-28 14:03
2002.07.01
СРОЧНО НУЖДАЮСЬ В ПОМОЩИ!!!!!!!!!!!!!!!!!!


4-1251
Nimbus
2002-04-30 23:08
2002.07.01
Диалоговое окно


1-1035
Сатир
2002-06-17 23:31
2002.07.01
Определение размера динамического массива





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