![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Условная компиляция
Kolan © (2005-06-04 13:59:00)Здравствуйте,
Продолжаю долбыть dll :). Но уже по книге. Вот вопрос. Я сделал dll и еще один модуль для работы с ней. Вот он:
unit PenniesInt;
interface
type
PCoinsRec = ^TCoinsRec;
TCoinsRec = record
Quarters,
Dimes,
Nickels,
Pennies: Word;
end;
{$IFDEF PENNIESLIB}
function PenniesToCoins(TotPenies: Word; CoinsRec: PCoinsRec): Word; stdcall;
{$ENDIF}
implementation
{$IFDEF PENNIESLIB}
function PenniesToCoins; external 'PENNIESLIB.dll' name 'PenniesToCoins'
{$ENDIF}
end.
Смысл весь как я понял в том, что используя {$IFDEF PENNIESLIB} я не компилирую описание экспорта функции. Те когда я компилирую dll с этим модулем компилится только структура.
Дальше когда я использую dll в другой программе я подключаю этот же модуль. Но ведь описание взова функции всё равно не скомпилируется пока я не определю'PENNIESLIB'.
Как мне сделать этот модуль чтобы я не изменяя его мог компилировать его и в dll и в других программах?
Ega23 (2005-06-06 10:46:00) [1]А "пенис" - разве так пишется???
icWasya (2005-06-06 10:45:00) [2]1) - определяй PENNIESLIB в опциях проекта - Project->Options->Directiries/Conditionals->Conditionals Defines
2)
а) создай для кажного проекта файл с установками - например
D:\Projects\DLL1\MyDefines.Inc
{$Define PENNIESLIB} // для DLL
и
D:\Projects\EXE\MyDefines.Inc
{.$Define PENNIESLIB} // для EXE
б) размести каждый такой файл в отдельный каталог для каждого проекта
в) в файлах проекта сделай {$Include ...} с указанием полного пути к нужному файлу MyDefines.Inc
г) в остальных файлах сделай {$Include MyDefines.Inc} с только имени файла MyDefines.Inc
д) не забывать делать ребилд проекта
Defunct (2005-06-04 20:27:00) [3]imho, условная компиляция это хорошо, но для dll-ок лучше использовать динамическую подгрузку функций.
> Как мне сделать этот модуль чтобы я не изменяя его мог компилировать его и в dll и в других программах?
Выкладывал когда-то такой пример, придется повторить:
unit uSomeDLL_interface;
interface
type TVersionFunct = function:ShortString;stdcall;
TFileFunct = procedure( AppHandle : Cardinal; FileName:ShortString);stdcall;
TProc = procedure;stdcall;
var
DLLVersion : TVersionFunct;
UploadFile : TFileFunct;
PortReset : TProc;
DLLReady : boolean = false;
implementation
uses SysUtils, Windows, Dialogs;
const
DLLName = 'somedll.dll';
var
HDll : Cardinal = 0;
procedure EmptyFileFunct( AppHandle: Dword; FileName: ShortString);stdcall;
begin
end;
procedure EmptyPortReset;stdcall;
begin
end;
function EmptyVersionFunct:ShortString;stdcall;
begin
Result := DLLName + ' is not attached';
end;
procedure SetEmptyFuncts;
begin
DLLVersion := EmptyVersionFunct;
UploadFile := EmptyFileFunct;
PortReset := EmptyPortReset;
DLLReady := False;
end;
procedure LoadInterface;
begin
if HDll = 0 then
HDll := LoadLibrary( DLLName );
if HDll <> 0 then
try
DLLVersion := GetProcAddress(Hdll, 'GetVersion');
UploadFile := GetProcAddress(Hdll, 'UploadFile');
PortReset := GetProcAddress(HDll, 'ResetPort');
DLLReady := 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.
Ученик (2005-06-04 14:18:00) [4]>Kolan © (04.06.05 13:59)
Если правильно понял вопрос :-)
function PenniesToCoins(TotPenies: Word; CoinsRec: PCoinsRec): Word; stdcall;
implementation
{$IFDEF PENNIESLIB}
function PenniesToCoins(TotPenies: Word; CoinsRec: PCoinsRec): Word; stdcall;
begin
end;
{$ELSE}
function PenniesToCoins; external 'PENNIESLIB.dll' name 'PenniesToCoins'
{$ENDIF}
end.