![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как симитировать работу программы - программа управлениия [D4, Win95/98]
aha © (2005-03-05 19:41:00)некоторым обьектом ( плата находится в компе в pci шине ) . Для управления программа использует DLL. То есть при разработке программы на другом компьютере поялвяется ошибка-- приложению не удалось запуститься - ХХХХ.dll не найден. ПРиходится в программе куски программы для обращения этой платы временно отключать - не очень удобно . Можно ли как то создать хотя бы пустую dll, которая бы ничего не делала бы , но позволяла программе функционировать ?
Набережных С. (2005-03-06 05:39:00) [1]
> Anatoly Podgoretsky © (05.03.05 21:31) [10]
А чтобы они заработали нужно вставить/убрать $define что-то, или в опциях, но это уж на вкус. Нет? Может есть другой способ условной компиляции, которого я не знаю?
Defunct (2005-03-06 02:13:00) [2]ps: вместо пустышек, можно написать эмулирующие device функции.
Defunct (2005-03-06 02:07:00) [3]Я в таких случаях поступаю так.
Пишу интерфейсный модуль, при инциализации пытаюсь подключить dll динамически, если не получается, то инициализирую все функции интерфейса пустышками и устанавливаю флажек, что библиотека не загружена.
пример:
допустим есть библиотека 'devicex.dll' с функциями
function GetDeviceStatus:TDevStatus;stdcall;
function DeviceReady:boolean;stdcall;
function GetDeviceData:TDevDataStruct;stdcall;
создаем интерфейсный модуль:
unit DeviceXInterface;
interface
const DLLName = 'devicex.dll';
type
TQueryFunct = function:boolean;stdcall;
TStatusFunct = function:TDevStatus;stdcall;
TDataFunct = function:TDevDataStruct;stdcall;
var
DeviceXReady : TQueryFunct;
DeviceXGetStatus : TStatusFunct;
DeviceXGetData : TDataFunct;
DeviceXInterfaceLoaded : boolean = false;
implementation
uses SysUtils, Windows, Dialogs;
var
HDll : Cardinal = 0;
function EmptyQueryFunct:boolean;stdcall;
begin
end;
function EmptyStatusFunct:TDevStatus;stdcall;
begin
end;
function EmptyDataFunct:TDevDataStruct;stdcall;
begin
end;
procedure SetEmptyFuncts;
begin
DeviceXReady := EmptyQueryFunct;
DeviceXGetStatus := EmptyStatusFunct;
DeviceXGetData := EmptyDataFunct;
DeviceXInterfaceLoaded := False;
end;
procedure LoadInterface;
begin
if HDll = 0 then
HDll := LoadLibrary( DLLName );
if HDll <> 0 then
try
DeviceXReady := GetProcAddress(Hdll, 'DeviceReady');
DeviceXGetStatus := GetProcAddress(Hdll, 'GetDeviceStatus');
DeviceXGetData := GetProcAddress(Hdll, 'GetDeviceData');
DeviceXInterfaceLoaded := True
except
on E:Exception do
begin
SetEmptyFuncts;
ShowMessage(E.Message)
end
end
else
SetEmptyFuncts;
end;
procedure FreeInterface;
begin
try
SetEmptyFuncts;
if HDll <> 0 then
begin
FreeLibrary( HDll );
HDll := 0
end
except
on E:Exception do ShowMessage(E.Message);
end
end;
initialization
LoadInterface;
finalization
FreeInterface;
end.
aha (2005-03-05 21:47:00) [4]пасибо , попробую ...
Anatoly Podgoretsky (2005-03-05 21:44:00) [5]Во всяком случае тебе дали два рабочих варианта, остальное от вкуса.
Anatoly Podgoretsky (2005-03-05 21:31:00) [6]Набережных С. © (05.03.05 21:03) [7]
Зачем что то комментировать?
А директивы условной компиляции на что?
GuAV © (05.03.05 20:51) [6]
А с учетом aha (05.03.05 21:17) [8] этого?
GuAV (2005-03-05 21:28:00) [7]File->New->Other...->DLL Wizard
Пишешь требуемые функции.
потом экпортируешь их
exports + F1
aha (2005-03-05 21:17:00) [8]а все таки где можно пример посмотреть , я с длл никогда не работал , даже создать не умею ....(((
Набережных С. (2005-03-05 21:03:00) [9]
> GuAV © (05.03.05 20:51) [6]
Т.е. менять ДЛЛ на диске проще, чем закомментировать/раскомментировать одну директиву? Ну, как говорится, о вкусах не спорят...
GuAV (2005-03-05 20:51:00) [10]с DLL ещё проще, просто перенести даже без перекомпиляции.
Anatoly Podgoretsky (2005-03-05 20:42:00) [11]GuAV © (05.03.05 20:38) [4]
ДЛЛ или модуль без разницы, в случае модуля очено быстро переходить от работчей к тестовой версии и упростит отладку. Хотя не затруднит и с ДЛЛ.
GuAV (2005-03-05 20:38:00) [12]Проще написать пустую DLL
File->New->Other...->DLL Wizard
и описать все ф-ции заглушки и экспортировать их.
Anatoly Podgoretsky (2005-03-05 20:04:00) [13]unit FalseDll;
объявление всех необходимых функций пустых или иммитаторов, не важно.
end;
В любой момент вместо FalseDll включаешь TrueDll, можно через директивы компилятора.
aha (2005-03-05 20:02:00) [14]без платы управления и dll не помогает , а можно поподробнее про заглушки - я про них скорее всего и имел ввиду , чтобы быстро можно было бы переделать ...
Anatoly Podgoretsky (2005-03-05 19:58:00) [15]Зачем пустую, есть же рабочая, только будь добр поместить ее туда где используешь. Или в крайнем случае сделай заглушки функций в своей программе.