型変換がうまくいかない – プログラミング – Home

型変換がうまくいかない
 
通知
すべてクリア

[解決済] 型変換がうまくいかない


KJ
 KJ
(@KJ)
ゲスト
結合: 21年前
投稿: 52
Topic starter  

開発環境 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からも参照設定なしで利用したいので、困っています。
インターフェイスの属性をいろいろ変えたりもしてみたのですが、
うまくいきません。
よろしくお願いします。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

すでに試されているかもしれませんが、

[id(2)] HRESULT Method1([in,string] BSTR path);

ではどうでしょうか。


返信引用
KJ
 KJ
(@KJ)
ゲスト
結合: 21年前
投稿: 52
Topic starter  

回答ありがとうございます。
連休中放置だったので、まだ未解決です・・・

>[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インターフェースの属性も見てましたが、違いが分から
ず・・・
なんか、とても初歩的なことでつまづいてる気がしてきました。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

ちょっと試してみましたが問題なく動きますね...
(WinXP, VC++6.0, Excel 2005)

他の既存COMオブジェクトで試してみるとか、
新しいATLプロジェクトで新COMオブジェクトを作って試してみるとかして、
Excelのコード、VC++、書いてるコードのどれが悪いのか
切り分けてみてはいかがでしょう。


返信引用
KJ
 KJ
(@KJ)
ゲスト
結合: 21年前
投稿: 52
Topic starter  

2種類のプロジェクトを作成してテストしてみました。

属性付きATLプロジェクトだとNG,
属性なしATLプロジェクトだとOKでした。

属性なしプロジェクトに後から属性を追加した場合、
元からあったクラスはOK、
後から追加した属性付きのクラスはNGでした。

.NET 2003のバグの予感がします。
IDispatch::GetTypeInfo()で、パラメータの型と属性をチェックしてみましたが問題な
し。

原因は分かりませんが、
属性なしでプロジェクトを作成しなおしたいと思います。

dairygoodsさん、ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました