2012-11-07 33 views
3

是否有一种简单的方法可以防止Ada名称在创建Ada DLL时受到损坏?防止在Ada DLL中出现重名的名称

这里是我的名.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; 

我的Python

import ctypes 

TestDLL = ctypes.WinDLL ("libTestDLL.dll") 
Print_Call = getattr(TestDLL, "[email protected]") 
Print_Call() 

你可以看到,我必须添加 '@ 0' 到我的函数名的末尾,但是当我将相同的代码移动到不同的编译器时,这似乎改变了。这给我造成了一些问题。我需要一个标准的格式化或一种方法来将所有的格式化在一起。

+0

“一个不同的编译器” - 你试过哪些编译器? –

回答

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"; 

接下来我们将介绍阿达接口编译指示: http://www.ada-auth.org/standards/12rm/html/RM-J-15-5.html

这个线程涵盖一点点讨论揭示了两者的区别: https://groups.google.com/forum/?fromgroups=#!searchin/comp.lang.ada/opengl/comp.lang.ada/6IVlMbtvrrU/mv3UUiDg5RwJ

+0

更多信息。谢谢! –

+0

我认为Google线程的主旨是你(Shark8)需要使用** External ** Name方面。它看起来好像Python正在使用Link_Name;所以Jon可以编写'pragma Export(DLL,Print_Call,Linker_Name =>“Print_Call”);'。这很混乱。 –

+0

是的,它很混乱;因为我在那里承认。 (我经常把这两个混在一起,不得不参考文档[或我现在工作的源代码],但我知道一个是“mangled-name”,另一个是“base-name”。) 我不得不使用外部因为这是基名,他需要使用链接,因为这是损坏的名称。 – Shark8

3

Apparently(第77条)大会DLLStdCall的同义词,据我了解,这会导致您报告的名称重组。

您可以用常规C做的更好:

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

甚至

pragma Export (C, Print_Call); 

(但随后的链接名称将是小写的,所以你需要改变的Python getattr()呼叫)。

我假设调用序列处理堆栈/参数的方式没有区别。