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