Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизУсловная компиляция Найти похожие ветки
← →
Kolan © (2005-06-04 13:59) [0]Здравствуйте,
Продолжаю долбыть 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 и в других программах?
← →
Ученик (2005-06-04 14:18) [1]>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.
← →
Defunct © (2005-06-04 20:27) [2]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.
← →
icWasya © (2005-06-06 10:45) [3]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
д) не забывать делать ребилд проекта
← →
Ega23 © (2005-06-06 10:46) [4]А "пенис" - разве так пишется???
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.043 c