Главная страница
    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.47 MB
Время: 0.039 c
1-1117621675
Леха
2005-06-01 14:27
2005.06.29
Не работает код заменящий переход с Таба на Ентер


1-1117821844
Tuzemec
2005-06-03 22:04
2005.06.29
избавиться от Sysutils подкиньте модуль


1-1118298249
c.j.frost
2005-06-09 10:24
2005.06.29
Компанент TreeView


4-1115562724
4dept
2005-05-08 18:32
2005.06.29
Как расшарить папку только на чтение в NT


4-1115404364
Wolfram
2005-05-06 22:32
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский