Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1112245143
Norn1
2005-03-31 08:59
2005.06.29
http&amp;ftp via proxy


14-1117171979
MBo
2005-05-27 09:32
2005.06.29
Пятничные головоломные задачки


14-1117594536
Kerk
2005-06-01 06:55
2005.06.29
С днем рожденья! 1 июня


3-1116279827
normandia
2005-05-17 01:43
2005.06.29
sum только по некоторым записям


1-1117903325
DimaK
2005-06-04 20:42
2005.06.29
Поиск определенного компонента на форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский