- PR -

LPCTSTRデータ型をVC#で受け取る

投稿者投稿内容
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-05-18 19:28
引用:

一応、COMで作っているのですが、引数の型が違うことに引っかかっています。



なら、最初にそう書きましょうよー
一口に「DLL」つっても何種類かあるので、「どんな」DLLなのかが分からないと、適切なアドバイスができないっす ;-p

つまるところ「COMコンポーネントを C# で書いている」わけですね?

で要するに、「COMコンポーネントから文字列を返したい」のでしょうか?
それとも「COMコンポーネントで文字列を受け取りたい」のでしょうか?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-19 08:31
引用:

渋木宏明(ひどり)さんの書き込み (2004-05-18 19:28) より:
引用:

一応、COMで作っているのですが、引数の型が違うことに引っかかっています。



なら、最初にそう書きましょうよー


一応、もう一つの質問に書いてあるのですが、みんながすべての質問をチェックしているわけではないですものね


 参照に書いておくなり、「ちょっとした気遣い」は、聞く者答える者、両方に必要ですね。
ino
会議室デビュー日: 2004/05/11
投稿数: 13
投稿日時: 2004-05-20 14:51
ご指導ありがとうございます。

書き込み自体が初心者なのでうまく説明できずに、
手間をかけさせてしまい申し訳ありませんでした。

以後、ご指導くださった点に気をつけて分かりやすい
書き込みをしたいと思います。

ありがとうございました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-05-20 21:02
引用:

書き込み自体が初心者なのでうまく説明できずに、
手間をかけさせてしまい申し訳ありませんでした。

以後、ご指導くださった点に気をつけて分かりやすい
書き込みをしたいと思います。



問題は解決したんでしょうか?

引用:

で要するに、「COMコンポーネントから文字列を返したい」のでしょうか?
それとも「COMコンポーネントで文字列を受け取りたい」のでしょうか?



は、結局どっちだったんでしょう?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
ino
会議室デビュー日: 2004/05/11
投稿数: 13
投稿日時: 2004-05-21 17:50
引用:
--------------------------------------------------------------------------------


で要するに、「COMコンポーネントから文字列を返したい」のでしょうか?
それとも「COMコンポーネントで文字列を受け取りたい」のでしょうか?

--------------------------------------------------------------------------------
「COMコンポーネントで文字列を受け取りたい」方です。

問題は解決したというより、妥協しました。
VC++6.0からVC#に直接受け渡したかったのですが、
うまくいかないので.NETのVC++で受け取ることにしました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-05-21 18:32
引用:

「COMコンポーネントで文字列を受け取りたい」方です。



C# で文字列を受け取るだけなら

public void Hoge(string str);

でOKです。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-05-22 00:12
引用:

C# で文字列を受け取るだけなら

public void Hoge(string str);

でOKです。



は、IDL 的には

HRESULT Hoge(BSTR str);

という形式になります。

これが常道ですが、大本の投稿には「LPCSTR を。。。」とありました。

もしこれが「IDL を見ずに、MFC で実装された COM オブジェクトの C++ ソースコードだけを見ている」発言したものだとすると、C# では↑の記述で問題ありません。

が、もし、IDL 的に

HRESULT Hoge(LPCSTR str);

なんて形式のメソッドを本気で求めているとしていたら、先に示したコードでは駄目です。

ですが、LPCTSTR は OLE オートメーション互換型では無いため、本来は回避するべき設計です。以前にも「BSTR を使ってみてはどうか?」というコメントがあったように、仕様の見直しをするべきです。

それでも、どーしても仕様の変更が難しい場合は

unsafe public void Hoge(byte* str);

とでもすればよいんじゃないでしょうか。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2004-05-22 00:16
もう遅いかもしれませんが。

.NET Framework のヘルプによると
引用:

型 LPTStr の文字列のエクスポートがサポートされていないため、この値は COM 相互運用ではサポートされず、プラットフォーム呼び出しだけでサポートされます。


だそうです。なので厳密には LPCTSTR 型の文字列を C# 側で受け取ることはできません。

ただし、動作環境を NT 系(Windows NT4/2000/XP/2003)に限定すれば LPCTSTR は LPCWSTR と同値になりますので、
コード:
public void Foobar([MarshalAs(UnmanagedType.LPWStr)] string str); 


のようにすれば取得できると思います。

補足 デフォルトでは、string は BSTR 型に変換(マーシャリング)されるようなので、MarshalAs 属性で LP(C)WSTR 型であることを示さないと多分うまくいかないと思います。試したことがないので何とも言えませんが。

スキルアップ/キャリアアップ(JOB@IT)