1

私の問題は、関数をエクスポートすることではなく、インポートすることです。DLLを指すためにハードコードされたパスを使用したので、関数とDLLの両方が機能することは確かです。

これが現在機能しているものです。

function RoamingAppDataPath: String; external 'C:\Users\Peter\AppData\Roaming\ss\Application\ss.dll';

ただし、ダイナミック値を使用してDLLをポイントする必要があるため、実行しようとしたのは

  1. グローバル変数を宣言します(DLLPath:String)
  2. DLLPathに値を割り当てます-RoamingAppDataPath+'\ss \ Application \ ss.dll'

注:RoamingAppDataPathは、ローミングアプリのデータフォルダーへのパスを出力する関数です。

私が実行しようとしているコードは次のとおりです。

function RoamingAppDataPath: String; external DLLPath;

コードをコンパイルすると、Delphiは定数式を期待していると言っています。

E2026 Constant expression expected

これの回避策は何ですか?

4

2 に答える 2

4

実行時にバインドする必要があります。つまり、LoadLibrary と GetProcAddress を使用する必要があります。

var
  lib: HMODULE;
  RoamingAppDataPath: function: string;

lib := LoadLibrary(dllfilename);
if lib=0 then 
  RaiseLastOSError;
Pointer(RoamingAppDataPath) := GetProcAddress(lib, 'RoamingAppDataPath');

そして、それを呼び出すことができます:

radp := RoamingAppDataPath;

いくつかのコメント:

  • 標準システム ライブラリに存在するのに、なぜこの関数を作成するのかわかりません。
  • DLL の境界を越えて文字列を使用すると、失敗する可能性があります。ShareMem を使用し、すべてのコードが同じ Delphi バージョンでビルドされていることを確認する必要があります。呼び出しコードでバッファを割り当てることをお勧めします。
于 2013-03-10T13:30:01.023 に答える
2

変数を使用できたとしても、静的 DLL を使用できない場合は既に初期化が使用されていないため、DLLPATH に値を設定することはできません。DLL のパスを定義する場合は、動的読み込みを使用する必要があります。

  procedure Test;external 'Notexists.DLL';
var
  Form2: TForm2;

implementation

{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
  test;
end;

initialization
Showmessage('Hallo'); // will never be seen if test is used.
于 2013-03-10T12:40:35.320 に答える