開発環境 VC++ 7.0 ATL
OS Windows XP
いまさらですが、ATLでCOMを作成しています。
用途は、Excel, スクリプト用です。
[
object, uuid(...),
dual, oleautomation, nonextensible,
pointer_default(unique)
]
__interface IMyClass : IDispatch
{
[id(2)] HRESULT Method1([in] BSTR path);
}
上記のようなdualインターフェイスを実装し、Execelから以下のようなコードで
メソッドを呼び出しました。
Dim path As String
Dim myObj As Object
Set myObj = CreateObject(MyDll.MyClass)
path = c:\test
myObj.Method1 path
以下のようなエラー発生します。
何故かパラメータpathがByRefと渡されるようで、
パラメータの型をBSTR* にしたら、動作します。
---------------------------
実行時エラー '13':
型が一致しません。
---------------------------
スクリプトから呼び出した場合は問題なく動いているのですが、
Excelからも参照設定なしで利用したいので、困っています。
インターフェイスの属性をいろいろ変えたりもしてみたのですが、
うまくいきません。
よろしくお願いします。
すでに試されているかもしれませんが、
[id(2)] HRESULT Method1([in,string] BSTR path);
ではどうでしょうか。
回答ありがとうございます。
連休中放置だったので、まだ未解決です・・・
>[id(2)] HRESULT Method1([in,string] BSTR path);
ダメでした。
[id(3)] HRESULT Method2([in] LONG val);
も、変数を介して渡すとアウトでした。
Dim myObj As Object
Set myObj = CreateObject(MyDll.MyClass)
Dim val
val = 3
myObj.Method2 val 'エラー!
直接、値を渡すとなぜかOKでした。なぜ!
myObj.Method2 3 'OK
OLE Viewerを使って、他のCOMインターフェースの属性も見てましたが、違いが分から
ず・・・
なんか、とても初歩的なことでつまづいてる気がしてきました。
ちょっと試してみましたが問題なく動きますね...
(WinXP, VC++6.0, Excel 2005)
他の既存COMオブジェクトで試してみるとか、
新しいATLプロジェクトで新COMオブジェクトを作って試してみるとかして、
Excelのコード、VC++、書いてるコードのどれが悪いのか
切り分けてみてはいかがでしょう。
2種類のプロジェクトを作成してテストしてみました。
属性付きATLプロジェクトだとNG,
属性なしATLプロジェクトだとOKでした。
属性なしプロジェクトに後から属性を追加した場合、
元からあったクラスはOK、
後から追加した属性付きのクラスはNGでした。
.NET 2003のバグの予感がします。
IDispatch::GetTypeInfo()で、パラメータの型と属性をチェックしてみましたが問題な
し。
原因は分かりませんが、
属性なしでプロジェクトを作成しなおしたいと思います。
dairygoodsさん、ありがとうございました。