7

一部のクラスを DLL に入れることは可能ですか?

取り組んでいるプロジェクトにいくつかのカスタム クラスがあり、それらを DLL に入れ、必要に応じてメイン アプリケーションでアクセスしたいと考えています。さらに、それらが DLL にある場合は、必要に応じて他のプロジェクトでこれらのクラスを再利用できます。に。

このリンクを見つけました: http://www.delphipages.com/forum/showthread.php?t=84394 DLL 内のクラスへのアクセスについて説明しており、クラス型プロパティへの委任について言及していますが、それ以上の情報は見つかりませんでした。これは、Delphi ヘルプまたはオンラインで確認できます。

クラスを DLL に入れるべきではない理由はありますか?それでよければ、上記のリンクの例よりも良い方法がありますか?

ありがとう

4

4 に答える 4

16

DLL からクラス/インスタンスを取得することはできません。クラスの代わりに、インターフェイスをクラスに渡すことができます。以下に簡単な例を示します

// The Interface-Deklaration for Main and DLL
unit StringFunctions_IntfU;

interface

type
  IStringFunctions = interface
    ['{240B567B-E619-48E4-8CDA-F6A722F44A71}']
    function CopyStr( const AStr : WideString; Index, Count : Integer ) : WideString;
  end;

implementation

end.

単純な DLL

library StringFunctions;

uses
  StringFunctions_IntfU; // use Interface-Deklaration

{$R *.res}

type
  TStringFunctions = class( TInterfacedObject, IStringFunctions )
  protected
    function CopyStr( const AStr : WideString; Index : Integer; Count : Integer ) : WideString;
  end;

  { TStringFunctions }

function TStringFunctions.CopyStr( const AStr : WideString; Index, Count : Integer ) : WideString;
begin
  Result := Copy( AStr, Index, Count );
end;

function GetStringFunctions : IStringFunctions; stdcall; export;
begin
  Result := TStringFunctions.Create;
end;

exports
  GetStringFunctions;

begin
end.

そして今、単純なメインプログラム

uses
  StringFunctions_IntfU;  // use Interface-Deklaration

// Static link to external function
function GetStringFunctions : IStringFunctions; stdcall; external 'StringFunctions.dll' name 'GetStringFunctions';

procedure TMainView.Button1Click( Sender : TObject );
begin
  Label1.Caption := GetStringFunctions.CopyStr( Edit1.Text, 1, 5 );
end;
于 2012-10-18T17:00:46.043 に答える
5

この目的にはランタイム パッケージを使用します。それはまさに彼らが最初に設計されたものです。これらは自動的にロードされ (または手動でロードできます)、同じメモリ マネージャーの共有が自動的に設定されるため、それらの間でクラスと型を自由に使用できます。

パッケージを使用する方がはるかに優れています (これは、まさにその理由で、IDE がその機能の多くに対して行っていることです)。

于 2012-10-18T12:47:18.927 に答える
3

Delphi は、DLL からのクラスのインポートまたはエクスポートをサポートしていません。別のモジュールからクラスをインポートするには、パッケージを使用する必要があります。

于 2012-10-18T12:45:25.593 に答える