Вверх ↑
Этот топик читают: Гость
Ответов: 206
Рейтинг: 19
#1: 2008-11-07 13:58:12 ЛС | профиль | цитата
вот пробую сделать динамичискую CallDLL (чтобы во время работы программы можно было выбирать какую длл загрузить)
вот остановился на таком вареанте (в архиве)
но он не работает почему-то
P.S. help читал

между
//edited
и
//
показаны изменения
там изменение всего одно

CallDLL2.rar >
code_10559.txt

карма: 0
Время : %time% Текущее время: %time%
0
файлы: 1code_10559.txt [2.7KB] [159]
Ответов: 2125
Рейтинг: 159
#2: 2008-11-07 14:33:35 ЛС | профиль | цитата
Я вчера переименовал свою машину в самолёт, но она почему-то не летает.
P.S. Толковый словарь читал
карма: 1

0
Ответов: 206
Рейтинг: 19
#3: 2008-11-07 15:05:06 ЛС | профиль | цитата
вот новый hiCallDLL2.pas

unit hiCallDLL2;

interface

uses Kol,Share,Windows,Debug;

type
TdllProc = procedure (var _Data:TValue; Index:word); cdecl;
TdllInitProc = procedure (var _Data:TValue; Index:word; Param:pointer); cdecl;
TdllInit = procedure (Event,Data:TdllInitProc; Param:pointer); cdecl;
THICallDLL2 = class(TDebug)
private
FID:Cardinal;
FEventCount:word;
FDataCount:word;
FWork:TdllProc;
FVar:TdllProc;

procedure SetEventCount(value:word);
procedure SetDataCount(value:word);
//edited
procedure SetDLLName(var _Data:TData; Index:word);
//
public
_prop_WorkCount:integer;
_prop_VarCount:integer;
onEvent:array of THI_Event;
Data:array of THI_Event;
//edited
_data_DLLName:THI_Event;
//
procedure _Dll_Event(var _Data:TData; Index:word);
procedure _Dll_Data(var _Data:TData; Index:word);
procedure doEvent(var _Data:TData; Index:word);
procedure EVar(var _Data:TData; Index:word);
property _prop_EventCount:word write SetEventCount;
property _prop_DataCount:word write SetDataCount;
//edited
//property _prop_DLLName:string write SetDLLName;
//
end;

function DataToValue(const Data:TData):TValue;
function ValueToData(const Val:TValue):TData;

implementation

function DataToValue(const Data:TData):TValue;
begin
Result.vtype := Data.Data_type;
case Result.vtype of
data_null: Result.vdata := nil;
data_int : Result.vdata := @Data.idata;
data_str : Result.vdata := PChar(Data.sdata + #0);
data_real: Result.vdata := @data.rdata;
end;
end;

function ValueToData(const Val:TValue):TData;
begin
case Val.vtype of
data_null: dtNull(Result);
data_int : dtInteger(Result,integer(Val.vdata^));
data_str : dtString(Result,PChar(Val.vdata));
data_real: dtReal(Result,Real(Val.vdata^));
end;
end;

procedure THICallDLL2.SetEventCount;
begin
SetLength(onEvent,Value);
FEventCount := Value;
end;

procedure THICallDLL2.SetDataCount;
begin
SetLength(Data,Value);
FDataCount := Value;
end;

procedure THICallDLL2._Dll_Event;
begin
if Index < FEventCount then
_hi_OnEvent(onEvent[index],_Data)
else dtNull(_Data);
end;

procedure THICallDLL2._Dll_Data;
begin
if Index < FDataCount then
_Data := ReadData(_Data,Data[index])
else dtNull(_Data);
end;

procedure dll_Event(var _Data:TValue; Index:word; Param:pointer); cdecl;
var dt:TData;
begin
dt := ValueToData(_Data);
THICallDLL2(Param)._Dll_Event(dt,Index);
end;

procedure dll_Data(var _Data:TValue; Index:word; Param:pointer); cdecl;
var dt:TData;
begin
dt := ValueToData(_Data);
THICallDLL2(Param)._Dll_Data(dt,Index);
_Data := DataToValue(dt);
end;

procedure THICallDLL2.SetDLLName;

var di:TdllInit;
//edited
fn,s1:string;
//
begin
//edited
s1 := ReadString(_Data,_data_DLLName,'');
fn := ReadFileName(s1);
//
if FileExists(fn) then
begin
FID := LoadLibrary(PChar(fn));
FWork := TdllProc(GetProcAddress(FID,'doWork'));
FVar := TdllProc(GetProcAddress(FID,'GetVar'));
di := tdllInit(GetProcAddress(FID,'DllInit'));
if Assigned(di) then
di(dll_Event,dll_Data,self);
end;
end;

procedure THICallDLL2.doEvent;
var Val:TValue;
begin
if Assigned(FWork) then
begin
Val := DataToValue(_Data);
FWork(Val,Index);
end;
end;

procedure THICallDLL2.EVar;
var Val:TValue;
begin
if Assigned(FVar) then
begin
Val := DataToValue(_Data);
FVar(Val,Index);
_Data := ValueToData(Val);
end;

end;

end.

карма: 0
Время : %time% Текущее время: %time%
0
Ответов: 8930
Рейтинг: 823
#4: 2008-11-07 15:13:32 ЛС | профиль | цитата
tsdima, у Вас образование не то, поэтому и не полетела машина, а вот один священнослужитель переименовал порося в карася, которого и съели в постный день
карма: 19

0
Ответов: 2125
Рейтинг: 159
#5: 2008-11-07 16:55:44 ЛС | профиль | цитата
Леонид, это-то как раз понятно Непонятно, как это должно работать. А пока нет этого понимания, то и реализация хромает.
------------ Дoбавленo:

Ладно, я не буду объяснять, почему доктор не берёт сразу скальпель, чтобы вылечить человека, а сначала диагноз ставит.
Мне просто интересно, задавался ли Ghost_Russia вопросом, а через какую точку будет произведена загрузка новой DLL?
Можно, конечно, в случае если имя DLL в свойствах не задано, зарезервировать doEvent1 и Data1 для загрузки DLL и её имени, тогда, кстати, появится возможность выполнить какие-то действия сразу после загрузки DLL (вызовется onEvent1 внутри DLL-ки).
карма: 1

0
Ответов: 206
Рейтинг: 19
#6: 2008-11-07 19:56:48 ЛС | профиль | цитата
через точку data имя: DllName


короче не кто мне опять не поможет
карма: 0
Время : %time% Текущее время: %time%
0
Ответов: 2125
Рейтинг: 159
#7: 2008-11-07 20:26:39 ЛС | профиль | цитата
Ты схему примера нарисуй! Пусть эта схема сейчас не работает, но глядя на схему, будет понятней ход твоих мыслей.
карма: 1

0
Ответов: 1161
Рейтинг: 160
#8: 2008-11-07 20:45:56 ЛС | профиль | цитата
ну у меня идея такая:
Динамический DLLCall такой же, что и обычный DllCall, вот только вместо имени библиотеки там имя глобальной переменной - например если изменилось значение переменной, то загружается библиотека
карма: 0

0
Ответов: 1088
Рейтинг: 112
#9: 2008-11-07 20:54:38 ЛС | профиль | цитата
ну у меня идея такая:

Нижняя точка - массив всех методов длл, левая точка вызов метода по его имени(брать из массива) правая понятно... верхняя дллНейм и параметры итого ~5 статических точек.
ЗЫ: ногами не пинать)
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 1161
Рейтинг: 160
#10: 2008-11-07 21:02:45 ЛС | профиль | цитата
Sniper36 писал(а):
вызов метода по его имени(брать из массива)

плохо будет то, что данные в поток так передаваться не будут. Ну или тогда использовать MT-потоки
карма: 0

0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)