0

開発環境:

  • Windows 2008 サーバー32 ビット
  • Visual Studio 2010 プロフェッショナル
  • ビジュアルベーシック6

対象環境:

  • Windows 2012 R2 64 ビット

VB6 アプリケーション ( app.exe) は、COM 可視の .NET DLL ( netdll.dll) に依存しています。これは、Visual Basic 6 によって生成された COM DLL に依存しています (ListBox オブジェクトを処理するためのラッパーです。それを呼び出しますvb6dll.dll)。

上記のように、dev os は 32 ビットであるため、それらはすべて 32 ビットです。fileまた、Cygwin で提供されるコマンドでそれらをチェックしました。

amessihel@aselkim:~> file path/to/app.exe
path/to/app.exe: PE32 executable (GUI) Intel 80386, for MS Windows

amessihel@aselkim:~> file path/to/netDLL.dll
path/to/netdll.dll: PE32 executable (DLL) (GUI) Intel 80386 Mono/.Net assembly, for MS Windows

amessihel@aselkim:~> file path/to/vb6.dll
path/to/vb6.dll: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows

RegAsm登録に使用されましたnetdll.dll:

amessihel@aselkim:~> /cygdrive/c/Windows/Microsoft.NET/Framework/v4.0.30319/RegAsm ./netdll.dll /codebase /tlb:netdll.tlb

SysWow64\RegSvr32vb6dll.dllターゲット環境への登録に使用されました。

amessihel@aselkim:~> /cygdrive/c/Windows/SysWOW64/regsvr32.exe ./vb6dll.dll

VB6 アプリケーションを起動すると、次のメッセージが表示されました。

次のエラーのため、CLSID {XXXX} を持つコンポーネントの COM クラス ファクトリを取得できませんでした: 80040154

この質問の重複ではないと思います。Windows 2008 から Windows 2012 R2 に変更さた CLSID をvb6dll.dll見つけました...そして、それnetdll.dllが見つからない理由のようです...もしそうなら、なぜ登録がこのように動作するのですか?

更新:私はCLSIDの初心者であることを認めます...明確に理解していれば、VB6は各COMオブジェクトのCLSIDを書き込み、これらのCLSIDはRegSvr32によって取得されます。正しい場合、Windows 2012 バージョンの RegSvr32 (SysWow64) がレジストリに別の CLSID を書き込むのはなぜですか?

4

1 に答える 1

0

解決しました。CLSID は DLL 内に書き込まれます。ここにあるコードを修正して、DLL のCLSIDを取得する小さなアプリを作成しました。私の DLL は、バイナリ互換性なしで生成されたコマンドラインだったので、同一ではないことがわかりました。

TL;DR :CLSID が変更されると、DLL も変更されます。

于 2016-01-07T16:26:58.043 に答える