none
VC2005で一度取り込んだActiveXのラッパークラスを再度取り込みなおすには? RRS feed

  • 質問

  • いつもお世話になっています。PATIOです。

     

    表題の件なんですが、自前でMFC ActiveX コントロールを作成して

    テスト用のプログラムを別途作成し、ダイアログ上に貼り付けます。

    この貼り付けたコントロールを選択して変数を追加でダイアログクラスのメンバーに

    変数を追加すると貼り付けたコントロールのラッパークラスが生成されます。

    で、この状態でテストを行って一段落した後でコントロールの仕様変更があって

    メソッドやプロパティを追加したとします。

    この時にテストプログラムのラッパークラスを取り込みなおさないと追加したメソッドや

    プロパティが使用できません。そこでラッパークラスを何とか取り込みなおそうと

    色々やったんですが、結局IDE上からの操作でうまく取り込みなおす事が出来ませんでした。

     

    VC++6ですと、取り込まれたラッパークラスを消して変数も一旦削除、リソースエディタ上で

    コントロールを消して張りなおし、メンバー変数の作成を行なえば、ラッパークラスも取り込み

    直されていたんですが、VS2005だとこれでも取り込みなおされません。

    結局、プロジェクト名.vcprojと言うファイルの中の記述を一部削除する事で取り込みなおしが

    出来たんですが、このやり方でよかったものか気になっています。

    もしかしてIDEからする方法があるのではないかとか、

    コントロール側を修正する時に何かしておけば取り込みなおせるのではないかとか

    考えているのですが、今のところ検討がつきません。

     

    何か情報をお持ちの方がいらっしゃいましたらよろしくお願いします。

     

    2007年12月14日 7:03

回答

  • # 間違えていたらゴメンナサイ。

     

    「add variable wrapper class rebuild vc++」辺りのキーワードでググったら以下のような

    資料が出てきました。

     

    >> Re: How to generate ActiveX wrapper class for C++ in VS2003?

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

    英日訳は以下略で。

     

    下から2つ目のMSFTの方からのレスポンスがそれっぽい回答な気がしますが、

    私的には見てないことにしたい気分です。

     

    書いてあるやり方を試みましたが、私が確認する限りはコントロールを使用する側(exe)の

    vcprojファイルの内部から

     

    コード ブロック

    <Global Name="{<対象のCLSID>}" Value="<対象のクラス名>">

     

    というブロックを消さない限り再度クラスが再生成されませんでした。

    (結局、初めての「変数追加」を行った状況を作ったのと同じだと思われますが)

     

    何か、やり方がマズっているカモしれません。

     

    (追記)

    上記はVC2003上での確認であり、VC2005上では確認を行ってません(確認ができません)。

    2007年12月17日 23:55
  •  st.lain さんからの引用

    書いてあるやり方を試みましたが、私が確認する限りはコントロールを使用する側(exe)の

    vcprojファイルの内部から

     

    コード ブロック

    <Global Name="{<対象のCLSID>}" Value="<対象のクラス名>">

     

    というブロックを消さない限り再度クラスが再生成されませんでした。

    (結局、初めての「変数追加」を行った状況を作ったのと同じだと思われますが)

     

    何か、やり方がマズっているカモしれません。

     

    (追記)

    上記はVC2003上での確認であり、VC2005上では確認を行ってません(確認ができません)。

     

    実は私がVS2005で行き着いた結論がまさしくこれでした。

    以下のところで書いているのがそうです。

    > 結局、プロジェクト名.vcprojと言うファイルの中の記述を一部削除する事で取り込みなおしが

    > 出来たんですが、このやり方でよかったものか気になっています。

     

    で、ほんとにこれで良いのか、不安になったのでここで訊いて見ている次第です。

    やはり、方法は用意されていないかなぁ。

    2007年12月18日 2:56

すべての返信

  • 見ている人は結構いるみたいですけれど、反応が無いのが痛いですね。

     

    既に既知の情報で何を今更と言う話ならぜひともそういう意見をください。

    そういう意見も参考になりますので。

     

    既に書いているような方法しか無いのであれば、それはそれで今後も同様の方法を使うだけなので

    問題は無いといえば無いのですが、正規の方法があるのに変な方法を使っているとしたらそれは是正したいので

    ここに書き込んでいます。もしくはIDEのラッパークラスの自動生成機能に頼っているのがそもそも問題なんですかねぇ。

    このあたりも合わせて御意見いただけると嬉しいです。

     

    2007年12月17日 6:46
  • 回答ではありませんのでご容赦下さい。

     

    1年ほど前に同じ悩みをVC2003で経験しました。

    当時はC#でテストプログラムがあれば良いという了解が取れたので、深く追求していませんでした。

     

    自宅のVC2003で触ってみているものの、IDEから再生成にスマートにできなさそうです。

    Googleでキーワードいくつか探ってみるものの収穫がありません。

     

    やはり、#importあたりを使えと言うことなのでしょうか…。

    2007年12月17日 15:10
    モデレータ
  • # 間違えていたらゴメンナサイ。

     

    「add variable wrapper class rebuild vc++」辺りのキーワードでググったら以下のような

    資料が出てきました。

     

    >> Re: How to generate ActiveX wrapper class for C++ in VS2003?

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

    英日訳は以下略で。

     

    下から2つ目のMSFTの方からのレスポンスがそれっぽい回答な気がしますが、

    私的には見てないことにしたい気分です。

     

    書いてあるやり方を試みましたが、私が確認する限りはコントロールを使用する側(exe)の

    vcprojファイルの内部から

     

    コード ブロック

    <Global Name="{<対象のCLSID>}" Value="<対象のクラス名>">

     

    というブロックを消さない限り再度クラスが再生成されませんでした。

    (結局、初めての「変数追加」を行った状況を作ったのと同じだと思われますが)

     

    何か、やり方がマズっているカモしれません。

     

    (追記)

    上記はVC2003上での確認であり、VC2005上では確認を行ってません(確認ができません)。

    2007年12月17日 23:55
  • #  再度お騒がせします。

     

    一応、VS-IDEのマクロから調べてはみましたが、AddValiableコマンドの一環として

    対象のコントロールのクラスが自動追加されているっぽいです。

     

    コマンドラインからラッパークラスを作成するものがあるのでは、と当初は期待

    していたのですが、その線は望めないカモしれません。

     

    # 一応、もうちょっと悪あがきしてみたいと思います。

     

     

    2007年12月18日 0:03
  •  st.lain さんからの引用

    書いてあるやり方を試みましたが、私が確認する限りはコントロールを使用する側(exe)の

    vcprojファイルの内部から

     

    コード ブロック

    <Global Name="{<対象のCLSID>}" Value="<対象のクラス名>">

     

    というブロックを消さない限り再度クラスが再生成されませんでした。

    (結局、初めての「変数追加」を行った状況を作ったのと同じだと思われますが)

     

    何か、やり方がマズっているカモしれません。

     

    (追記)

    上記はVC2003上での確認であり、VC2005上では確認を行ってません(確認ができません)。

     

    実は私がVS2005で行き着いた結論がまさしくこれでした。

    以下のところで書いているのがそうです。

    > 結局、プロジェクト名.vcprojと言うファイルの中の記述を一部削除する事で取り込みなおしが

    > 出来たんですが、このやり方でよかったものか気になっています。

     

    で、ほんとにこれで良いのか、不安になったのでここで訊いて見ている次第です。

    やはり、方法は用意されていないかなぁ。

    2007年12月18日 2:56
  • で、ほんとにこれで良いのか、不安になったのでここで訊いて見ている次第です。

    先に書いたように、マクロの呼び出し履歴を見る限りは恐らく通常の手段ではこれが

    限界ではないかと思っています。

     

    やはり、方法は用意されていないかなぁ。

    VS2003版ではAddValiableウィザード自体は恐らく$(VSInstallDir)Vc7\VCWizards\MemVariableWiz\Scripts\1041

    にあるdefault.jsスクリプトの処理であろうと思われるので、それを変更なりしてユーザマクロから叩くことが

    できれば、、、とは思うのですが。(やりたくは無いですね)

     

    # これ以上は流れを追ってないのでJScriptだけで閉じたウィザードなのかは知りません。

    # JS内に「InvokeHelper」の文字も見当たらないので、他のモジュールが幾つか関連するとは

    # 思っています。

     

    VS2003からラッパーの再生成に関する意見は出ているでしょうし、その改善無くVS2005でも

    受け継がれた流れを見る限り、再生成に関して何かしらの不都合があってこのような流れを

    取ったのだ、と思いたいです。

     

    # とはいえ、ホントに改善してほしい点でもあります。 (VS2008はどうなのでしょう・・)

    2007年12月18日 3:25
  • 色々調べてもらってありがとうございます。

    私はそこまで調べきれてませんでした。

     

    まあ、ほんとに他に方法が無いならこれで行くしかないかと言うのが正直な所です。

    全く方法が無いわけでは無いのでそれが救いですね。

    VS2008で改善されていたら私のVS2008への評価は少し上がりそうです。

    今のところ、結構不具合を積み残したままの出荷のようなので評価が低いんですけれど。

     

    情報があれば、切実に欲しい所なのでもうしばらくこのまま閉じずに置いておこうと思います。

    期を見てしめたいと思います。

     

    2007年12月18日 9:52
  • もう1年以上経過していますが、VS2008 SP1では以下の方法でラッパークラスを作り直せるかと思います。

    ① 古いラッパークラスのファイル(h/cpp)を物理的に消す。
    ② ソリューションエクスプローラでラッパークラスを挿入したいプロジェクトを右クリック。
    ③ ポップアップメニューから[Add] - [Class...]をクリック。(私のは英語版のVSなので日本語版では不明ですが、[追加] - [クラス...]あたりかと想像)
    ④ MFC Class From TypeLibを選択。ocxファイル中に複数のActiveXコントロールが含まれる場合は、いったん全てのラッパークラスを生成しておき、後で不要なファイルを消すのが無難です(バグ?)。MFC Class From ActiveX Controlの方はプロパティが展開されません(これもバグか?)。

    VC6との違いはcppファイルは生成されず、hファイルに全てインラインで埋め込まれます。このあたりはC#/VB/Javaっぽい感じです。

    MFC Class From ActiveX Controlでプロパティが消えてしまう件については、IDLをget/set風に書き換えてメソッドのところに移動させれば正しく表示されるようにはなります。このあたりの仕様変更は、VC6のクラスウィザードでMFC ActiveXコントロールを作ってきた者にとっては苦痛です。
    2009年2月10日 23:45