2013-07-09 85 views
1

我正在尋找示例來調用不使用COM的perl代碼中的C++ dll。我可以使用win32 :: API嗎?該庫是寫在Visual Studio 2010中如何在不使用com的情況下在perl中調用C++ dll?

+0

最可靠和最常見的方法是在C中編寫一個調用dll的XS擴展。然而,如果你不使用COM來使用二進制兼容性,那麼對所有內容使用相同的編譯器通常是一個好主意。有關於使用VC++編譯perl的說明,請參見http://perldoc.perl.org/perlwin32.html – user1937198

+0

讓我重新說明問題:我正在尋找示例,在不使用COM的情況下調用perl代碼中的C++ dll。該庫是用visual studio 2010編寫的。我正在尋找並發現使用extern C __dllexport聲明方法,並使用win32 :: API-> new()編寫perl腳本可以幫助我實現相同目標。有沒有相同的鏈接或完整的例子? – user2564824

+0

[文檔](http://search.cpan.org/perldoc?Win32::API)有例子。 – ikegami

回答

1

可以

  • 創建使用XS一個基於C的模塊。
  • 使用Inline::C創建C函數。使用Win32::API::More。 (如果該DLL不使用stdcall調用約定,則需要將該DLL打包爲一個。)
+1

感謝您的迴應。我跟着這個鏈接,它爲我工作.http://eli.thegreenplace.net/2006/12/04/compiling-c-dlls-and-using-them-from-perl/ – user2564824

0

調用C++方法或構造函數,使用Win32 :: API,可能不會。

Win32 :: API不支持32位窗口上的C++調用約定(__thiscall)。在64位Windows上,它將起作用,因爲在Win64上只有一個調用約定。使用C++最大的問題是ABI兼容性和名稱混亂。 Win32 :: API沒有提供幫助處理名稱修改。您必須找到每個C++函數(這是C++中的一個方法)的錯誤名稱,並將其提供給Win32 :: API。 Win32 :: API可以與任意C函數指針一起工作,因此一個充滿C函數(如COM中)的vtable在Win32 :: API中工作正常,對於這個舊例子,請參閱http://perlmonks.org/?node_id=969555。此外,您還必須知道C++對象和C++標準庫在彙編代碼級別上的含義。 Win32 :: API不支持32位C++調用約定。這是第一個路障。我(Win32 :: API的作者之一)可能有一天會在Win32 :: API中實現__thiscall。

COM/OLE被髮明不必處理不同的C++編譯器之間的ABI問題。假設您知道COM如何在純C中工作,Win32 :: API在COM對象上工作時沒有問題。要了解COM如何在純C中工作,我建議閱讀本文系列http://www.codeproject.com/Articles/13601/COM-in-plain-C。 Win32 :: OLE和Win32 :: API可以像perlmonks示例中所示的那樣進行黑客入侵。

相關問題