- - PR -
LPCTSTRデータ型をVC#で受け取る
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-05-22 00:22
なるほど、それでデフォルトでは BSTR にマーシャリングされるのか。 #COM 自体には疎いもので。 | ||||||||||||||||||||||||||||
|
投稿日時: 2004-05-22 09:56
それは違います。 文字列を扱う API の規則について不正確に理解されていると思います。 Win32 API で文字列を扱うものの多くは、シングルバイト文字とダブルバイト文字を扱うものの2種類が用意されています。 つまり、ヘルプなどで Hoge(LPCTSTR str) という API が説明されていた場合、実際には HogeA() と HogeW() という DLL 関数が存在します。 Hoge() と LPCTSTR は SDK のヘッダ中で、大雑把に言って
のようになっています。 どちらの形式を使うかは、VC++ では、ビルド時のオプション指定で決定されます。 (デフォルトはシングルバイト文字を使用) これらの API を .NET で扱う場合、属性で API 名を明示することが出来ます。
API 名を省略した場合、9x 系OSでは xxxA() 系の DLL 関数が、NT 系OSでは xxxW() 系の DLL 関数が自動的に選択されます。
長くなりましたが、以上の規則と、coclass のメソッド引数のマーシャリングの間には何も関係がありません。 coclass のメソッド引数の形式はその設計時に決定され、ビルド時に固定されます。 これが実行時に変化することはありません。 オートメーション互換型を外れているので、決して奨励しませんが、ある coclass のメソッドが
という形式であったなら、この coclass をビルドした時に _UNICODE マクロが定義されていたかどうかによってのみ、引数型が確定します。 通常、_UNICODE マクロが無効な状態でビルドするでしょうから、上記のメソッドは
と等価となります。 なので、件のメソッド引数のマーシャリング規則を属性で指定するなら、
が妥当です。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||||||||||||||||||||||
|
投稿日時: 2004-05-22 10:10
余談になってしまいますが、
というクラスをクラスライブラリとしてビルドし、tlbexp して OLE/COM Viewer で確認をしてみたところ、
となり、NgCom には1つもメソッドがエクスポートされていませんでした。 .NET のクラスを単純に coclass としてエクスポートした場合、ディスパッチオブジェクトになりますが、オートメーション非互換の型が含まれているメソッドは自動的に除外されてしまうようです。 (警告も出ませんでした) そこで、
としてみたところ
という結果を得ました。 カスタムインターフェースになら、オートメーション非互換の型が含まれていてもOKなようです。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||||||||||||||||||||||
|
投稿日時: 2004-05-27 10:27
返信がおくれてすみませんでした。
引用;--------------------------------------------------------------------------- ですが、LPCTSTR は OLE オートメーション互換型では無いため、本来は回避するべ き設計です。以前にも「BSTR を使ってみてはどうか?」というコメントがあったよう に、仕様の見直しをするべきです。 それでも、どーしても仕様の変更が難しい場合は unsafe public void Hoge(byte* str); とでもすればよいんじゃないでしょうか。 ---------------------------------------------------------------------------- EXEの方を変更ができないので、なんとかLPCSTRを受け取りたかったので、 ご指導いただいた方法などためしてみたのですが、 やはり、LPCSTRを受け取るのは難しいようなので、 VC++を間に入れる方法で進めようと思います。 色々な情報ありがとうございました。 | ||||||||||||||||||||||||||||
|
投稿日時: 2004-05-27 16:37
.exe からの呼び出しがカスタムインターフェース経由なら対応できたはずです。 ディスパッチインターフェース経由で呼び出されていたのですか? _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ |
«前のページへ
1|2|3