0

cpp COMオブジェクトを利用するac#ソリューションがあります。COMオブジェクトとc#アプリケーションはどちらも、64ビットシステム用に特別に構築されています。VS 2010から実行すると、ソリューションは正しく機能します。ただし、別のシステム(64ビット)にインストールした後、COMオブジェクトが見つかりません。

インストール時に登録されなかったためだと思いましたが、苦労しているようです。やってみると

regsvr32 ComObject.dll

「モジュール'ComObject.dll'の読み込みに失敗しました。バイナリが指定されたパスに保存されていることを確認するか、デバッグしてバイナリまたは依存する.DLLファイルの問題を確認してください。

dllが存在するディレクトリからzippy32を呼び出しており、名前が正しく入力されていることをトリプルチェックしました。インストーラーに登録して、dll登録スイッチをvsdrfCOMに設定しようとすると、「「ComObject.dll」という名前のファイルの登録情報を作成できません。これは、dllが別のソリューションでビルドされ、追加されたことが原因である可能性があります。リソースとしてこのソリューションに。

その結果、開発システムにインストールでき、正常に動作します。これは、VSがすでにdllを登録しているためだと思います。(現在、dllは問題を引き起こしていたため、インストーラーの一部ではないため、デバッグフォルダーにコピーしました。

誰かが私が間違っているかもしれないことについて何か考えを持っていますか?

追加情報:

David Heffernanからの指示に基づいて、私はDependencyWalkerを正しい方法で実行しました。以下は、「エントリポイントDllRegisterServerが見つかりませんでした」というエラーが表示される前の最後の数行です。

...
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "DrawThemeText") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBB61F8.
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "EndBufferedAnimation") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBB4F98.
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "GetBufferedPaintDC") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBC0BC0.
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "GetBufferedPaintTargetDC") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBC0B5C.
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "EndBufferedPaint") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBB4F98.
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "FindGadgetFromPoint") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC581F40.
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "ForwardGadgetMessage") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC582CAC.

[OK]を押すと、次のようになります。

LoadLibraryW("comctl32.dll") called from "USER32.DLL" at address 0x00000000779A91DC.
LoadLibraryW("comctl32.dll") returned 0x000007FEFCC10000.
GetProcAddress(0x000007FEFCC10000 [COMCTL32.DLL], "RegisterClassNameW") called from "USER32.DLL" at address 0x00000000779A91F9 and returned 0x000007FEFCC38024.
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "BufferedPaintStopAllAnimations") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBCE408.
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBBFA04.
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DisableContainerHwnd") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC57A38C.
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBBFA04.
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DUserFlushMessages") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC57A8A0.
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DUserFlushDeferredMessages") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC57A830.
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DeleteHandle") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC574BB8.
GetProcAddress(0x00000000779A0000 [USER32.DLL], "UnregisterMessagePumpHook") called from "DUSER.DLL" at address 0x000007FEFC57B8A9 and returned 0x00000000779A8564.
DllMain(0x0000000180000000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPIEX64.DLL" called.
DllMain(0x0000000180000000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPIEX64.DLL" returned 1 (0x1).
DllMain(0x000007FEFB5F0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPI32.DLL" called.
DllMain(0x000007FEFB5F0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPI32.DLL" returned 1 (0x1).
DllMain(0x0000000051AF0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MFC100.DLL" called.
DllMain(0x0000000051AF0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MFC100.DLL" returned 1 (0x1).
DllMain(0x000007FEF9E60000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MSIMG32.DLL" called.
...
Exited "REGSVR32.EXE" (process 0x23A0) with code 4 (0x4).

DllRegisterServerの言及以外に特定のエラーメッセージはありません。私は管理者として実行しました。実行中に、モジュールリストに追加のエラーが発生しました:ファイルを開くときにエラーが発生しました。指定されたパスが見つかりません。それは空の文字列なので、それは理にかなっています。横に疑問符が付いているので、ディレイロードだと思います。

zippy32.exeでDependencyWalkerを再度実行したところ、次のエラーが発生しました。

LoadLibraryExW("C:\Program Files\Project\ComObject.dll", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned NULL. Error: The specified module could not be found (126).

また、ログファイルの先頭に次のエラーがあります。

Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

よろしくお願いします。

4

3 に答える 3

1

依存関係の問題である可能性があります。DependencyWalkerで解決してください。プロファイルメニューを使用してプロセスを開始します。zippy32を実行します。コマンドライン引数と作業ディレクトリを指定します。

私の推測では、問題はMSVCランタイムの欠落ですが、ツールは失敗の原因を明らかにします。

登録が機能するように、DependencyWalkerを昇格して実行する必要があります。

于 2013-03-08T00:21:20.610 に答える
0

System32多くの場合、Windowsは、またはSysWOW64ディレクトリからアプリケーションを実行する必要があるかどうかについて混乱します。

64ビットバージョンのregsvr32:を明示的に実行してみてください。

%SystemRoot%\System32\regsvr32.exe ComObject.dll
于 2013-03-08T00:43:44.767 に答える
0

DavidHeffermanとWhozCraigに感謝します。あなたの情報は、私がDependency Walkerを使い始めるのに役立ちました。これは、検出されたものを解釈する方法を理解した後、強力なツールになることがわかります。また、考えられる問題を突き止めるのにも役立ちました。

結局、私は別の方向に進むことになりました。cppプロジェクトをメインプロジェクトに追加し、インストーラーで出力を使用しました。これにより、正しく登録されました。これがzippy32の実行とどのように違うのかはまだわかりませんが、違いが何であれ、それが原因で動作が開始されました。

于 2013-03-13T17:14:34.617 に答える