3

Visual Studio 2012 を使用して C++ ベースの COM オブジェクトを作成しました。これは 64 ビット マシン (32 ビット コードによって呼び出され、32 ビット アウトプロセス COM サーバーを呼び出す) で登録され、正常に動作しますが、32 ビットでは登録されません。ビット マシン (XP でも Win7 32 ビットでもない)。regsvr32 からのメッセージは

LoadLibrary("comobj.dll") failed - The specified procedure could not be found.

プロジェクトはもともと Visual Studio 6 (7 年前) でビルドされました。BEGIN_COM_MAP や BEGIN_SINK_MAP などの ATL マクロを使用して、さまざまなインターフェイスの実装を宣言します。呼び出している COM サーバーが変更されたため (新しい ProgID、新しい GUID、新しいタイプ ライブラリなど)、再コンパイルする必要がありました。これらの調整を行い、現在の VS を使用する以外に、(意図的な) 変更はありませんでした。プロジェクト ファイルの古い同等物には、64 ビットを指すものは何もありませんでした。

DEPENDS.EXE の 64 ビット バージョンで DLL を調べると、KERNEL32 や USER32 などの標準参照 DLL の横に「64」アイコンが表示されます。64 ビット マシンで DLL をビルドしたことを除けば、DLL について「64 ビット」のものを見つけることができません。ターゲットは明示的に Win32 (X64 ではない) です。

32 ビット バージョンの DEPENDS.EXE (Virtual PC で実行されている Windows XP 上) で DLL を調べると、32 ビット バージョンには存在しない FlsAlloc FlsFree FlsGetValue FlsSetValue への参照があるため、赤いアイコンで KERNEL32.DLL が表示されます。カーネル32.DLL。(私はそれらが何であるかわかりませんし、それらの参照がどこから来たのかわかりません-おそらく、コンパイルが行われた64ビットマシン上のMFCのコピーからですか?)

XPにVS2012をインストールして、そこで再コンパイルする必要があるのでしょうか?現在の Visual Studio を使用して C++ で Win32 COM オブジェクトをビルドするために、実際にこれを行う必要があるのでしょうか?

私がどこを見ているか知っている人はいますか?すべてのプロジェクトとソリューションのオプションを確認しましたが、64 ビットに設定されているものはないようです。「MFC の使用」の下のオプションは「標準の Windows ライブラリを使用する」に設定されています。これがおそらく答えですが、それが 32 ビット Windows に移植できない場合、「標準ライブラリ」のみを使用することはほとんどありません。(これを送った後、それを変更しようとします。)

アドバイスをよろしくお願いします。

4

1 に答える 1

3

Visual Studio 2012 に付属する既定のツールセットは、Vista で後で導入された特定の API を使用することにより、Windows XP と互換性のない出力を生成します。

最新の Microsoft C++ コンパイラのパワーと豊富な機能を活用し、Windows XP との互換性を維持するには、Visual Studio 2012 Update 1 で導入された代替ツールセット コードネーム "v110_xp" を使用する必要があります。利用可能なのはVisual Studio Update 3であり、Visual Studio の利用可能な最新の更新プログラムを単純にインストールすることをお勧めします。

プロジェクト設定で利用可能な設定があります。

ここに画像の説明を入力

詳しくは、Windows XP 用の C++ 11 プログラムの構成を参照してください。

于 2013-08-01T12:23:08.257 に答える