我有一個32位的DLL,可以通過com模型和關聯的tlb文件訪問。tlb文件是否具有關聯的體系結構?
該DLL似乎是x86。
有什麼辦法從x64程序訪問這種類型的DLL嗎? tlb文件是x86/x64不可知的嗎?
我問因爲某些功能出現上班,別人撞車,和人失蹤相比.NET程序集。
- 編輯 -
缺少組件出現由於在OEM的部分錯誤。
我有一個32位的DLL,可以通過com模型和關聯的tlb文件訪問。tlb文件是否具有關聯的體系結構?
該DLL似乎是x86。
有什麼辦法從x64程序訪問這種類型的DLL嗎? tlb文件是x86/x64不可知的嗎?
我問因爲某些功能出現上班,別人撞車,和人失蹤相比.NET程序集。
- 編輯 -
缺少組件出現由於在OEM的部分錯誤。
在大多數情況下,類型庫肯定是平臺不可知的。在微軟發佈的Windows編程中,大多數人都會遇到這種情況。在.NET中最容易看到,這使得編寫可以運行在32位或64位模式下的代碼變得非常簡單,這些模式由AnyCPU平臺目標公開。要使用Microsoft.Office.Interop中的interop類或在Office程序內部運行的寫擴展,您不需要任何特殊的操作即可使用完全相同的類型庫。
但是,當您使用由程序員創建的類型庫從未考慮過它在64位代碼上工作時,這並不總是奏效。最典型的麻煩是由方法參數引起的,這些方法參數實際上是引擎蓋下的指針,但是展平爲整數類型,long是典型的選擇。這些指針值在64位模式下爲64位寬,並且在嘗試將它們填充到32位整數時出現錯誤。 HANDLE值是一個很好的例子。
迄今爲止最臭名昭着的oops是微軟的一個。 ADO的類型庫已經被破壞,這是一個廣泛用於與數據庫引擎交流的數據庫提供程序庫。他們在Windows 7 SP1中發生了重大變化,這種變化在程序員在該操作系統中構建他們的程序並發現它不再適用於較早版本的Windows時引起廣泛的不幸。這種哎呀是另一種方式,一種在64位操作系統上應該是32位的類型,但在64位操作系統上被宣稱是64位。當您擁有Windows SDK版本8,adoint_Backcompat.h頭文件ADO_LONGPTR類型時,您可以看到此哎呀。由adoint.h中的替換爲。
最好與原程序員一起工作,以便將其整理出來。或者利用COM代理,當從64位進程調用時,它們可以運行32位代碼。
它已經很長一段時間了,但我認爲正確的答案是'它取決於'。有些事情可能會透明地處理,有些則不會。我的猜測是,大多數時候在那裏會有一些特定平臺的位置,但有些人對此更加了解可能會糾正我。
試試這篇關於將midl(用於生成com類型庫的語言)移植到64位的文章。 http://msdn.microsoft.com/en-us/library/ms810720.aspx
但是真的你的問題不是tlb。這只是一種類型描述符。問題將是在dll中執行這些類型。你不能將一個32位的DLL加載到一個64位的進程中。 Can I load a 32 bit DLL into a 64 bit process on Windows?
一種可能的解決辦法,如果你不能端口的dll,包括替代32位進程和進程間通信 http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/
類型庫確實包含86 VS在SYSKIND enumeration 64標誌。實際上它甚至支持16位Windows。它可以通過ITypeLib::GetLibAttr method,像這樣的東西來讀:
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
CComPtr<ITypeLib> tlb;
LoadTypeLib(L"C:\\myPath\\MyFile.tlb", &tlb);
TLIBATTR *patt;
tlb->GetLibAttr(&patt);
switch(patt->syskind)
{
case SYSKIND::SYS_WIN64:
printf("WIN64");
break;
case SYSKIND::SYS_WIN32:
printf("WIN32");
break;
case SYSKIND::SYS_WIN16:
printf("WIN16");
break;
}
tlb->ReleaseTLibAttr(patt);
CoUninitialize();
}
注意SYSKIND不是一個標誌,它是一個枚舉,你不必像「任何CPU」的值。
COM是一種在它們之間進行通信的方法,它們是隔離的嗎? – Mikhail
COM本身不是。 COM可以處於proc或proc之外。 DCOM沒有proc風味。 D用於分佈式,或者是單獨的進程或機器,以及代理通過rpc調用。因此,您可以通過dcom連接32個rpc進程。 Dom是實現圖片的一個選項。在你的情況下可能是一個很好的選擇。此時,您已經解決了流程問題,然後可以返回到類型lib問題 – dkackman
這句話應該是'dcom是實現ipc的一個選項'。該死的自動更正和太多的首字母縮略詞 – dkackman