6

com モデルと関連する tlb ファイルを介してアクセスするように設計された 32 ビット DLL があります。

DLL は x86 のようです。

x64 プログラムからこの種の DLL にアクセスする方法はありますか? tlb ファイルは x86/x64 に依存しませんか?

一部の機能は機能しているように見え、他の機能はクラッシュし、o̶t̶h̶e̶r̶s̶ ̶a̶r̶e̶ ̶m̶i̶s̶s̶i̶n̶g̶ ̶c̶o̶m̶p̶a̶r̶e̶d̶ ̶t̶o̶ ̶t̶h̶e̶ ̶.̶n̶e̶t̶ ̶a̶s̶s̶e̶m̶b̶l̶i̶e̶s̶ .

- 編集 -

OEM 側のエラーにより、不足しているアセンブリが表示されます。

4

3 に答える 3

5

タイプ ライブラリは、ほとんどの場合、プラットフォームにとらわれないように意図されていました。Microsoft によって出荷された Windows プログラミングで遭遇するほとんどのものは、. AnyCPU プラットフォーム ターゲットによって公開され、32 ビット モードまたは 64 ビット モードのいずれかで実行できるコードを非常に簡単に記述できるようにする .NET で最も顕著です。Microsoft.Office.Interop の相互運用クラスを使用する場合も、Office プログラム内で実行される拡張機能を作成する場合も、特別なことは何も必要ありません。まったく同じタイプ ライブラリを使用します。

しかし、64 ビット コードで動作するとはまったく考えていなかったプログラマによって作成されたタイプ ライブラリを使用すると、必ずしもうまくいくとは限りません。最も典型的な問題は、実際にはフードの下のポインターであるが、長い間典型的な選択である整数型にフラット化されているメソッド引数によって引き起こされます。これらのポインター値は、64 ビット モードでは 64 ビット幅であり、それらを 32 ビット整数に詰め込もうとすると誤動作します。HANDLE 値が良い例です。

最も悪名高い oops は Microsoft のものです。dbase エンジンとの通信に広く使用されているデータベース プロバイダ ライブラリである ADO のタイプ ライブラリが破損していました。彼らは、Windows 7 SP1 で重大な変更を行いました。この変更は、プログラマーがそのオペレーティング システムでプログラムを構築し、それが古いバージョンの Windows では動作しないことがわかったときに、広範囲にわたる悲惨な状態を引き起こしました。おっと、64 ビット オペレーティング システムでは 32 ビットであると想定されていた型が、64 ビット OS では 64 ビットであると宣言されていました。これは、Windows SDK バージョン 8、adoint_Backcompat.h ヘッダー ファイル、ADO_LONGPTR タイプがある場合に表示されます。adoint.h でlongに置き換えられます。

これを整理するには、元のプログラマーと協力するのが最善です。または、COM サロゲートを利用するために、64 ビット プロセスから呼び出されたときに 32 ビット コードをプロセス外で実行できます。

于 2013-05-21T09:29:30.330 に答える
3

タイプ ライブラリには、SYSKIND 列挙に x86 対 x64 フラグが含まれています。実際、16 ビット Windows もサポートしています。次のようなITypeLib::GetLibAttr メソッドを使用して読み取ることができます。

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」値のようなものはありません。

于 2013-05-21T08:46:18.513 に答える
2

長くなりましたが、正解は「場合による」と思います。透過的に処理されるものもあれば、そうでないものもあります。私の推測では、ほとんどの場合、そこにはプラットフォーム固有のビット数が含まれていると思いますが、それについて詳しい人が私を訂正してくれるかもしれません。

midl (com タイプ ライブラリの生成に使用される言語) の 64 ビットへの移植に関するこの記事を試してください。http://msdn.microsoft.com/en-us/library/ms810720.aspx

しかし、本当にあなたの問題はtlbではありません。それはただの束型記述子です。問題は、dll でのこれらの型の実装になります。32 ビット dll を 64 ビット プロセスにロードすることはできません。 Windows で 32 ビット DLL を 64 ビット プロセスにロードできますか?

代理32ビットプロセスとプロセス間通信を含む、dllを移植できない場合の可能な解決策 http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-コード/

于 2013-05-21T03:25:09.893 に答える