none
ActiveXのコンパイルエラーについて RRS feed

  • 質問

  • Win7(64)環境でActiveXを作ろうとしています。

    この環境では初めてなので、初心者のような質問ですが、教えてください。

    目的のActiveXでエラーが出て、分からないので 枠だけのActiveXプロジェクトを作成してビルトしたところ、以下のようなエラーが出てしまいました。

    共通のエラーのようです。

    良く分からないので誰か教えてもらえませんか?

    Microsoft.CppCommon.targets ファイルの中で発生しているようです。

    特に警告 89 と エラー 90 の意味が良くわかりません。

    -------------------------

    警告 1 要素 名前空間 'http://schemas.microsoft.com/developer/msbuild/2003' の 'PropertyGroup' には無効な子要素
     名前空間 'http://schemas.microsoft.com/developer/msbuild/2003' の 'IntDirTrailingSlashWarning' が含まれています。
     必要とされる要素は 名前空間 'http://schemas.microsoft.com/developer/msbuild/2003' の 'Property, AllowUnsafeBlocks, AppConfigForCompiler... です。
     C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets 21 6 その他のファイル

     上記のようなWarningが87個続く

    警告 89 warning MSB3075: コマンド "regsvr32 /s "G:\src\dummy\x64\Debug\dummy.ocx"" はコード 5 で終了しました。
     このコマンドを実行するための十分な権限があるか確認してください。 
     C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets 744 6 dummy

    エラー 90 error MSB8011: 出力の登録に失敗しました。
     ユーザーごとのリダイレクトを有効にするか、引き上げられたアクセス許可を使用して、コマンド プロンプトからコンポーネントを登録してください。 
     C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets 756 6 dummy

    2012年12月13日 8:38

回答

  • DllInstall がないのですね。それが原因です。

    MFCは、その出自が古いためテンプレートも基本的には古いままの部分が多く、ユーザーリダイレクトも対応していません(デフォルトのソース)。

    そのため、自分で追記してやる必要があります。

    幸いにもテンプレートとしてATLがこのあたりを組み込んでいますので、そちらを参考にすればよいでしょう。

    ATLのひな型からの変更点は、

    ATL::AtlSetPerUserRegistration(true);

    AfxSetPerUserRegistration( TRUE );

    にするだけです。

    それ以外の部分は、そのままコピーして利用できます。

    これを組み入れて(defファイルにもDllInstallの記述を追加する)ビルドすれば先のエラー4もなくなり、正しくビルドされるようになります。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 佐伯玲 2012年12月14日 7:09
    • 回答としてマーク 佐伯玲 2012年12月17日 0:16
    2012年12月14日 6:10

すべての返信

  • Warning が87個続くというのは、たぶんエラーウィンドウ上ですよね?

    一度すべてのファイルを閉じて、ビルドしてみてください。開いているソースのエラーとごちゃ混ぜになっていると何が本当のエラーで何は関係ないものなのか区別がつかなくなります。

    で、本題。

    警告 89 は、エラーコード5すなわち、「アクセス違反」でエラーとなっています。

    エラー90は、アクセス違反が発生して出力が登録できなかったので、ユーザーリダイレクトを有効にして、ActiveXの登録をHKEY_LOCAL_MACHINEではなく、HKEY_CURRENT_USER に対して行うように指示するか(そういう風にOCXを作っておく必要がある)、ビルド時の登録は行わず、昇格したアクセス権(要するに管理者権限で実行)で動作しているコマンドプロンプトから登録するようにするようにしてくださいと書いてあります。

    もちろん、VS自身を管理者権限で動作させて実行するという選択肢もあります。あまりお勧めできるものではありませんけど。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年12月13日 10:02
  • 回答ありがとうございます。

    ユーザーリダイレクトを有効にしてリビルトしてみたら、今度はエラーコード4でエラーになりました。

    再度ビルトすれば正常終了しました。リビルトだけでは駄目なんですね。

    ちなみに、ActiveXの登録をHKEY_LOCAL_MACHINEではなく、HKEY_CURRENT_USER に対して行うように指示する

    には何処を変更すれば宜しいんでしょうか?

    コマンドプロンプトの方は、管理者権限で起動しないでも、regsvr32を実行すれば成功しました。

    エラーになるかと思ったが正常終了したので、余計原因が分からなくなってしまいました。

    取り合えず解決はしました。ありがとうございました。

    2012年12月14日 1:12
  • >今度はエラーコード4でエラーになりました。

    エラーコード4ってなんだろう?

    WinError.h には、ERROR_TOO_MANY_OPEN_FILES と定義されていますね。

    「ファイルを開くことができません。 」というエラーテキスト(Win7x64環境)を持っているようです。

    こちらはちょっとわかりませんね。再現性がないみたいなので(リビルドしてエラーが出てそのあとビルドで成功は普通はない)。

    >ActiveXの登録をHKEY_LOCAL_MACHINEではなく、HKEY_CURRENT_USER に対して行うように指示する

    プロジェクトのプロパティの、リンカー - 全般にある「ユーザーごとのリダイレクト」を「はい」にするだけです。

    でも、この設定は、あくまでも外部パラメータなので、プログラムを書き換えて対応するのとは異なります。いま設定したのはプログラムコードを書き換えて対応していませんか?

    もしそうならば、リンカーの設定を変更するようにしてください。

    それでうまくいかない場合は、DllInstall をエクスポートしているかを確認してください。していない場合は、DllInstall を用意する必要があります。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年12月14日 1:52
  • > WinError.h には、ERROR_TOO_MANY_OPEN_FILES ...

    そうですか。私も初めての現象で、混乱しています。

    > プロジェクトのプロパティの...

    プロジェクトプロパティで、リンカー - 全般にある「ユーザーごとのリダイレクト」を「はい」にしました。

    プログラム上では何もしていません。

    レジスタへの書き込み位置を変更することを書いていたので、その方法を確認したかったのですが。

    > DllInstall をエクスポートしているかを確認してください

    .def ファイルの中の EXPORTS の中には定義が無いです。

    ActiveXを開発するとき、32ビットではDllInstallを必要としなかった(気にしていなかっただけかもしれないが)

    ので、今回も特に気にしなかったのですが。

    勘違いならごめんなさい。

    2012年12月14日 5:39
  • DllInstall がないのですね。それが原因です。

    MFCは、その出自が古いためテンプレートも基本的には古いままの部分が多く、ユーザーリダイレクトも対応していません(デフォルトのソース)。

    そのため、自分で追記してやる必要があります。

    幸いにもテンプレートとしてATLがこのあたりを組み込んでいますので、そちらを参考にすればよいでしょう。

    ATLのひな型からの変更点は、

    ATL::AtlSetPerUserRegistration(true);

    AfxSetPerUserRegistration( TRUE );

    にするだけです。

    それ以外の部分は、そのままコピーして利用できます。

    これを組み入れて(defファイルにもDllInstallの記述を追加する)ビルドすれば先のエラー4もなくなり、正しくビルドされるようになります。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 佐伯玲 2012年12月14日 7:09
    • 回答としてマーク 佐伯玲 2012年12月17日 0:16
    2012年12月14日 6:10
  • ありがとうございました。

    コンパイルエラーはなくなりました。

    2012年12月14日 6:33