なんかまたヘルプで別のプロジェクトの作業やってるわけですけど、VC++ でオートメーション DLL を作れ、とのこと。
VC++ は入社後ほとんど触ってないし、かなりヤバめ。
そんな感じでここ一週間くらい色々ハマってたのでメモ。
■DLL まわり
「この関数使ってね」と DLL だけ渡されて、ヘッダファイルもライブラリファイルも無いような状態。
# 正確にはドキュメントから手動で起こしたヘッダファイルはあったんですが…信頼性低かったり
で、いちいち LoadLibrary() とかかったるいので、ロード時動的リンクしたいわけで。
・DLL から LIB ファイルを作る方法
Borland C++ Builder には implib.exe なんてのがあったけど、それに似たのがあるとか。(情報元)
Visual Studio のインストール先によっては、DumpBin.exe とか参照できなかったりするので、そのへんは適当に。
(2005/04/21 削除。シンボリックリンクになってないのであまり意味がないっぽい)
・LIB ファイルから関数定義を抜き出す方法
関数名が知りたいだけなら Visual Studio 付属の Dependency Walker やらフリーソフトの Dependency Viewer を使えばいいわけですけど、もっと厳密な定義が知りたい場合。
DumpBin.exe を使う。
DUMPBIN /EXPORTS hoge.lib
LIB ファイルに対してではなく、DLL に対して実行しても大丈夫だったと思う。
とりあえずこの出力結果を適当に加工すればヘッダファイル作れます。
■オートメーション周り
今回はオートメーション DLL(ActiveX DLL みたいなもの。たぶん)を作るわけですが。
これも結構ハマりました。
・オートメーションの登録
regsvr32 hoge.dll
とかやればいいんですけど、このときも使用する DLL のパスが通ってないとエラー発生。
このエラーメッセージがわかりにくい。
たとえば hoge.dll のを登録しようとしたけど、fuga.dll が無くて失敗するような場合、
LoadLibrary("hoge.dll") failed - 指定されたモジュールが見つかりません。
というエラーメッセージしか出ないので混乱した。
・VBScript からの利用
VBScript は Variant 型しか使えないので、BSTR 型とかの戻り値は使えない(たぶん)。
仕方ないのでプロパティやメソッドの戻り値なんかはすべて VARIANT で実装。
で、Class Wizard で作った VARIANT 型のプロパティは、そのままでは外部から値を設定できないっぽい(?)
どうもオブジェクト生成時に、内部変数が実態を持っていないような状態らしい。
仕方ないのでコンストラクタで COleVariant("").Detach() あたりに設定しておいた。
・IE で ActiveX の警告出さないための工夫?
参考にしてたソースが、AppWizard で作られるものよりも複雑だったので、何なのか調べてみると、
To Mark MFC Controls Safe for Scripting/Initialization
こういう措置をとっているらしい。
でもこと同じような宣言を含む objsafe.h なんてのもあるみたいだし、ちょっと古い情報なのかも。
■VBScript の実行
なぜか私の環境で .vbs ファイルを実行すると
".vbs" を持つスクリプト エンジンはありません。
なんてエラーが出てたので、これを回避したかったわけですが。
まず .vbs が %SystemRoot%\System32\wscript.exe とかに結びついてなかったので、普通にフォルダオプションで指定。
それでもダメだったので、一緒に仕事してる人にレジストリ情報送ってもらった。
色々違ってたけど、とりあえず↓みたいな感じで .reg ファイル作って登録すれば最低限のことはできるかも。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\VBSFile\ScriptEngine]
@="VBScript"
まぁバックアップは忘れずに。
色々知識不足でスケジュール遅れまくりです。
でもま、このへんは Windows プログラマとして身に付けておきたかった部分なので、この機会にできるだけ色々吸収しておこうかと。