我正在尋找示例來調用不使用COM的perl代碼中的C++ dll。我可以使用win32 :: API嗎?該庫是寫在Visual Studio 2010中如何在不使用com的情況下在perl中調用C++ dll?
回答
可以
- 創建使用XS一個基於C的模塊。
- 使用Inline::C創建C函數。使用Win32::API::More。 (如果該DLL不使用stdcall調用約定,則需要將該DLL打包爲一個。)
感謝您的迴應。我跟着這個鏈接,它爲我工作.http://eli.thegreenplace.net/2006/12/04/compiling-c-dlls-and-using-them-from-perl/ – user2564824
調用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示例中所示的那樣進行黑客入侵。
- 1. 在不使用COM的情況下從C++調用C#方法
- 2. 如何在不通過COM的情況下從VB6調用C++ DLL?
- 3. 如何在不添加DLL的情況下在C#中使用DLL函數?
- 4. 在不使用DLL的情況下在Delphi中使用捲曲
- 5. 在不使用系統的情況下從perl調用java類
- 6. 在C中使用COM dll#
- 7. C#如何在沒有中間C++層的情況下直接調用ml64 dll?
- 8. 如何在C#中不使用Edmx的情況下使用DbContext?
- 9. 在沒有代理安裝的情況下調用COM +中的遠程.NET DLL
- 10. 使用在C#中使用COM的DLL
- 11. 如何在不使用vsdrfcomselfreg的情況下注冊DLL
- 12. 如何在不知道參數的情況下使用dll?
- 13. 如何在不加載CLR的情況下使用託管DLL?
- 14. 如何在不使用Visual Studio的情況下編譯DLL?
- 15. 如何在不使用COM Automation的情況下使用Word文檔?
- 16. 如何在不使用DLL的情況下運行沒有依賴的DLL?
- 17. 如何在不使用curl和apache2的情況下在本地使用Perl CGI?
- 18. C如何在不帶參數的情況下調用函數?
- 19. 如何在不使用eval的情況下動態調用類?
- 20. 如何在不使用showDocument的情況下從applet調用javascript?
- 21. 如何在不調用方法的情況下使用變量
- 22. 如何在不使用javascript的情況下從Asp.Net調用WebMethod
- 23. 如何在不使用AmazonSecurityTokenServiceClient的情況下調用AssumeRoleWithSAMLAsync
- 24. 如何在不使用IBaction/InterfaceBuilder的情況下調用UISwitch touch
- 25. 如何在不使用WebReference的情況下調用WebService?
- 26. 如何在不在objective-c中引用的情況下調用委託?
- 27. 如何在不使用InstallShield的情況下從OCX中提取Com信息?
- 28. 如何在不使用Visual Studio的情況下添加COM引用?
- 29. 如何在不使用「InvalidOperationException」的情況下在C#中使用「using」?
- 30. 如何調用在這種情況下
最可靠和最常見的方法是在C中編寫一個調用dll的XS擴展。然而,如果你不使用COM來使用二進制兼容性,那麼對所有內容使用相同的編譯器通常是一個好主意。有關於使用VC++編譯perl的說明,請參見http://perldoc.perl.org/perlwin32.html – user1937198
讓我重新說明問題:我正在尋找示例,在不使用COM的情況下調用perl代碼中的C++ dll。該庫是用visual studio 2010編寫的。我正在尋找並發現使用extern C __dllexport聲明方法,並使用win32 :: API-> new()編寫perl腳本可以幫助我實現相同目標。有沒有相同的鏈接或完整的例子? – user2564824
[文檔](http://search.cpan.org/perldoc?Win32::API)有例子。 – ikegami