none
リンクエラー:VC7.1からVC8に変換 RRS feed

  • 質問

  • 早速ですが、質問させてください。
     VC7で作成されたソリューションをVC8でリビルドしてみたところ、
     以下のエラーが発生しました。

    エラー内容

    1>リンクしています...

    1>stdafx.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>AssemblyInfo.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>AssemblyInfo.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>KBBarControl.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>KBBarControl.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>C:\Documents and Settings\"user_name"\My Documents\Visual Studio Projects\KBBar\Debug\KBBar.dll : fatal error LNK1120: 外部参照 1 が未解決です。


    リンクエラーなのはわかるのですが、
    必要な libファイルを推測する材料がないためエラーの原因がよくわかりません。

    ソースは下記URLからダウンロードし たものを一部変更したものです。

    http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B821793


    変更点

    [ソリューションエクスプローラ]
    >KBBarプロジェクトを右クリック
    >[プロパティ]
    >[共通プロパティ]
    >[参照設定]
    >" Interop.SHDocVw.1.1dll " を削除
    >" KBbar\temp\Interop.SHDocVw.dll " を追加


    上記変更によって、VC7.1で実行時と、同様の参照設定になると思います。

    下記URLにて、同様のエラーが質問されているのですが、私の勉強不足のため理解には至りませんでした。

    http://www.thescripts.com/forum/thread430973.html

    大変長くなり、申し訳ありません。
    解決方法をご存知の方、ご教授お願いいたし ます。

    2006年9月26日 11:44

すべての返信

  • 直接の解決にはつながらないのですが、

    AxInterop.SHDocVw.dll and Interop.SHDocVw.dll

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=55688&SiteID=1

    ``If you working on .NET Framework v2.0, then you do not need to use the older COM based ActiveX Control. There is a new WebBrowser Control built in Managed Code for .NET v2.0

    If you use the .NET v2.0 based WebBrowser control, which will be present in your toolbox, then you do not need those Interop assemblies.''

    と、.NET Framework v2.0 では、SHDocVw.dll を使う必要はないようです。(多分…)

    # Interop::SHDocVw::WebBrowserClassとあるので、WebBrowser Control を使いたいのだと考えています > KBBar

    Visual Studio 2005 で .NET Framework v1.x の build ができるのかどうかは確認していません…。

     

    2006年9月26日 13:38
  • Takashi SAKAMOTOさま

    返信ありがとうございます。

    ># Interop::SHDocVw::WebBrowserClassとあるので、WebBrowser Control を使いたいのだと考えています > KBBar

    そうです。KBBar内の、navigate_to_urlメソッド(特定URLへ移動する)のために

    必要なものです。


    SHDocVw.dllが使う必要がない(可能性がある)ということだったので、

    ・参照設定から、Interop::SHDocVw.DLLを削除

    ・Interop::SHDocVw::WebBrowserClass に関するものをコメントアウト

    リビルドしたところ、全く同じエラーに遭いました。

    >Visual Studio 2005 で .NET Framework v1.x の build ができるのかどうかは確認していません…。

    やっぱり無理ですかね、、、

    もしエラー解消法ご存知の方いましたら、お願いいたします。


    エラー内容

    1>リンクしています...
    1>stdafx.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>AssemblyInfo.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>AssemblyInfo.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>KBBarControl.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>KBBarControl.obj : error LNK2001: 外部シンボル ""?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)" は未解決です。
    1>C:\Documents and Settings\"user_name"\My Documents\Visual Studio Projects\KBBar\Debug\KBBar.dll : fatal error LNK1120: 外部参照 1 が未解決です。

    2006年9月27日 12:37
  • すみません。派手に勘違いをしていました。Form Application に WebBrowser を貼り付ける話ではなかったのですね…

    確認してみると、

    • C:\WIDOWS\SYSTEM32\ieframe.dll を tlbimp した結果の Introp.SHDocVw.dll の厳密名が FALSE になっている。
    • 署名されてないと厳密名を設定できないが、KBBar.snk を keyfile として追加できない (2003 は記述できるのですが…)
    • 変換後のプロジェクトで keyfile に KBBar.snk が抜け落ちてしまっている。
    • 変換後のプロジェクトのリンクする追加の依存ファイルに msvcrt.lib, msvcmrt.lib (release build) ないしmsvcrtd.lib, msvcmrtd.lib (debug build) が抜けている。

    が問題のようです。最初から手順を書くと、

    • 参照設定の Introp.SHDocVw.1.1 を削る。
    • tlbimp.exe C:\WINDOWS\SYSTEM32\ieframe.dll /keyfile:KBBar.snk /out:Introp.SHDocVw.dll を実行する。
    • 生成された Introp.SHDocVw.dll を Temp の下あたりにコピーする。
    • Temp の下の Introp.SHDocVw.dll をプロジェクトの共通プロパティの参照に追加する。
    • プロジェクトのリンクの追加の依存ファイルに先のライブラリ2つを追加する。
    • プロジェクトのリンクの詳細のキーファイルに KBBar.snk を追加する。

    これで、KBBar.dll は build できて、gacutil /if KBBar.dll までは通る筈です。

     

    2006年9月28日 6:24
  • Takashi SAKAMOTOさま 

    返信ありがとうございます。

    原因・手順とも詳しく教えていただき、大変助かりました。

    おっしゃた通りにしましたところ、KBBarまで、ビルドすることができました。

    ありがとうございます。


    続いて、SampleKBについて、出たエラーなのですが、

    メンバ関数のポインタの代入の方法が変わったみたいですね、、、

    エラーメッセージ通り、"&~"をコピペしたものを関数に代入してOKでした。

    あとは、namespaceの優先度が変わったみたいですね、、、

    extern したSendMessage関数を、呼び出しの際namespaceを省略すると、system::~の関数として認識していました。


    おそらく最後になるかと思いますが、もう一つ質問させてください。

    SampleKB.DLLのビルド後のイベントで以下のエラーがでました。


    [エラー内容]

    1>ビルド後のイベントを実行しています...
    1>Microsoft (R) .NET Global Assembly Cache Utility.  Version 2.0.50727.42
    1>Copyright (c) Microsoft Corporation.  All rights reserved.
    1>アセンブリが正しくキャッシュに追加されました
    1>Microsoft(R) .NET Framework Assembly Registration Utility 2.0.50727.42
    1>Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.
    1>RegAsm : error RA0000 : 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)
    1>Project : error PRJ0019: ツールはエラー コードを返しました : "ビルド後のイベントを実行しています...



    >regasm SampleKB.DLL

    の実行に失敗しているようです。
    コマンドプロンプトからも、同様のエラーが出ました。
    ですが、ちゃんとフォルダの中には、SampleKB.DLLは存在しています。
    ちなみに、SampkeKBの参照設定は、変更していません。

    なにか必要なものがあるのでしょうか?
    わかるかたおられましたら、お願いいたします。

    2006年9月28日 9:28
  • regasm の返す 0x8008007E は module not found が原因のようです。

    可能性としては、

    • KBBar.dll, Interop.SHDocVw.dll が見付からない。
    • SampleKB.dll, KBBar.dll が必要としている MSVCR80.DLL (DebugならMSVCR80D.DLL), MSVCM80.DLL(MSVCM80D.DLL), MSCOREE.DLL のどれかが見付からない。

    の2つでしょうか…。

    • C:\WINDOWS\Assembly (WindowsXP での話なのですが) の中に KBBar.dll, Interop.SHDocVw.dll  が存在するかどうか、公開キートークンが等しいかどうかチェックする (Explorer で見るのが楽なようです)。
    • SampleKB.dll も gacutil /if は成功しているようですから、上と同じようにチェックする。
    • Dependency Walker で SampleKB.dll が参照している DLL が存在しているかどうかチェックする。

    の3つを試してみるぐらいしか思い付かないです。この3つの結果はどうなっているでしょうか?

     

    2006年9月28日 10:34