3

Ada DLL を作成するときに Ada 名が壊れないようにする簡単な方法はありますか?

これが私の.adbコードです

with Ada.Text_IO;
package body testDLL is
   procedure Print_Call is
   begin
      Ada.Text_IO.Put_Line("Hello World");
   end Print_Call;

   function Add_Nums(A,B : in Integer) return Integer is
   begin
      return A + B;
   end Add_Nums;

end testDLL;

私の .ads

package testDLL is
   procedure Print_Call;
   pragma export (dll, Print_Call, "Print_Call");

   function Add_Nums(A,B : in Integer) return Integer;
   pragma export (dll, Add_Nums, "Add_Nums");
end testDLL;

私のパイソン

import ctypes

TestDLL = ctypes.WinDLL ("libTestDLL.dll")
Print_Call = getattr(TestDLL, "Print_Call@0")
Print_Call()

関数名の末尾に「@0」を追加する必要があることがわかりますが、同じコードを別のコンパイラに移動すると、これが変わるようです。これは私にいくつかの問題を引き起こしています。標準のマングリング形式か、マングリングをまとめて削除する方法が必要です。

4

2 に答える 2

5

次のように記述して、プラグマの Link_Name および External_Name パラメータを介してオブジェクト名を制御できます。

pragma Export (C, Print_Call, "Print_Call", "Print_Call");

あるいは、Ada2012 を使用している場合は、アスペクトを使用してこれらを指定できます。

function Add_Nums(A,B : in Integer) return Integer
    with Export, Convention => Ada, Link_Name => "Add_Nums";

以下は、Ada のインターフェイス プラグマをカバーしています: http://www.ada-auth.org/standards/12rm/html/RM-J-15-5.html

このスレッドでは、2 つの違いを明らかにするちょっとした議論を取り上げています: https://groups.google.com/forum/?fromgroups=#!searchin/comp.lang.ada/opengl/comp.lang.ada/6IVlMbtvrrU/mv3UUiDg5RwJ

于 2012-11-07T18:51:08.587 に答える
3

どうやら(セクション77)コンベンションDLLは、の同義語でStdCallあり、あなたが報告するような名前マングリングをもたらすと私は理解しています。

あなたは慣習でもっとうまくいくかもしれませんC

pragma Export (C, Print_Call, "Print_Call");

あるいは

pragma Export (C, Print_Call);

(ただし、リンク名は小文字になるため、Pythongetattr()呼び出しを変更する必要があります)。

呼び出しシーケンスがスタック/パラメーターを処理する方法に違いはないと思います。

于 2012-11-07T16:09:01.513 に答える