Delphi Xe。私は方法のいずれかを参照してくださいWindows.pasにDLLからオーバーロード関数をエクスポートするには?
モジュールでは:
function InterlockedExchangeAdd(Addend: PLongint; Value: Longint): Longint stdcall; overload;
{$EXTERNALSYM InterlockedExchangeAdd}
function InterlockedExchangeAdd(var Addend: Longint; Value: Longint): Longint stdcall; overload;
{$EXTERNALSYM InterlockedExchangeAdd}
...
function InterlockedExchangeAdd(Addend: PLongint; Value: Longint): Longint; external kernel32 name 'InterlockedExchangeAdd';
function InterlockedExchangeAdd(var Addend: Longint; Value: Longint): Longint; external kernel32 name 'InterlockedExchangeAdd';
手段
、DLLは同じ名前の関数をエクスポートすることができます。私は繰り返してみてください:
私はそれが正常にコンパイルされたプロジェクト
Program TestMyDll;
{$APPTYPE CONSOLE}
uses SimpleShareMem, SysUtils;
Function MyFunc(const X:Integer):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
Function MyFunc(const X:Extended):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
begin
try
Writeln;
Writeln('MyDll test');
Writeln('Int: ' + MyFunc(10));
Writeln('Real: ' + MyFunc(10.55));
Readln;
except on E: Exception do Writeln(E.ClassName, ' : ', E.Message);end;
end.
を作成します。さらに私は、DLLの作成:
Library MyDll;
uses
SimpleShareMem,
DllUnit1 in 'DllUnit1.pas';
{$R *.res}
begin
//test
MyFunc(10);MyFunc(10.55);
end.
...とモジュールDllUnit1.pas
Unit DllUnit1; Interface
Function MyFunc(const X:Integer):string; Overload; StdCall;
Function MyFunc(const X: Extended):string; Overload; StdCall;
Exports
MyFunc; // COMPILE ERROR
Implementation
Uses SysUtils;
Function MyFunc(const X:Integer):string;
begin
result:=Inttostr(x);
end;
Function MyFunc(const X: Extended):string;
begin
result:=Floattostr(x);
end;
end.
をしかし、コンパイル時に、私はエラーが表示さ:[DCCのエラー] DllUnit1.pas(7):E2273いいえ、オーバーロードをこのパラメータリストを持つ 'MyFunc'のバージョンはです。デルファイヘルプで
は、私は以下を参照してください。
"Delphi Language Reference"/"The exports clause"
...
When you export an overloaded function or procedure from a dynamically loadable library, you must specify its parameter list in the exports clause. For example,
exports
Divide(X, Y: Integer) name 'Divide_Ints',
Divide(X, Y: Real) name 'Divide_Reals';
On Windows, do not include index specifiers in entries for overloaded routines.
質問:
どのように正しくモジュールDllUnit1でこれらの関数をエクスポートすると、Delphiで、一般的にそれを行うことが可能であるかどうか(エクスポート1つの名前の下で)私のプロジェクトTestMyDllから同じ呼び出しを最初(Windows.pasの例)と同じように受け取りますか?
このような関数を別の言語(VB、C++)からの呼び出しDLLによって正しく動作させるかどうかにかかわらず、1つの名前でエクスポートできますか?あるいは、異なる名前の2つの関数を作成する方が良いでしょうか?
P.S.少し似たような質問がここに見つかりましたが(http://stackoverflow.com/questions/6257013/how-to-combine-overload-and-stdcall-in-delphi)、答えは私に合っていませんでした
P.S.悪い英語
ADD(答えの後に追加しました)明らかに
、感謝します。
はそうなりました:プロジェクトで:
Function MyFunc (const X:Integer):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
Function MyFunc (const X:Extended):string; StdCall; External 'MyDll.dll' Name ' MyFunc1'; Overload;
Exports
MyFunc (const X:Integer) Name 'MyFunc',
MyFunc (const X:Extended) Name 'MyFunc1';
DllUnit1
ではそれがコンパイルされ、正常に動作します。それでも質問:作品のよう
、それが正しいかどうか?
かどうかを書き込む方法価値がある "関数MyFuncと(定数X:整数):文字列を、過負荷、STDCALL;"または "関数MyFunc(const X:整数):文字列; StdCall;オーバーロード;"他の言語(VB、C++、C#の)のプロジェクトで
この機能が正しく原因とされるのですか?
Answer、please、その他の質問 –
あなたが見せてくれたことは今や大丈夫です。はい、他の言語は、異なる名前でエクスポートされているので、関数をlonとして使用できるようになります。 –
使用文字列以降、他の言語ではこの機能を使用できません。 –