Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Условная компиляция   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
14-1117254337
D2005
2005-05-28 08:25
2005.06.29
Есть ли возможность?


14-1117695099
Суслик
2005-06-02 10:51
2005.06.29
вроде смешно :)


3-1116611965
Вольман Виктор
2005-05-20 21:59
2005.06.29
SQL к ADO


4-1114528628
viper - omsk
2005-04-26 19:17
2005.06.29
Открытие приложения


14-1117781798
Koala
2005-06-03 10:56
2005.06.29
Вопрос о редакторах звука