C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: void型へのポインタ


(過去ログ 96 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■57406 / inTopicNo.1)  void型へのポインタ
  
□投稿者/ いちろう (4回)-(2011/02/25(Fri) 11:43:48)

分類:[.NET 全般] 

C++のコードをC#に書き換えたいのですが、
PVOID pArg1 の部分はどのように書き換えればよいのでしょうか。
PVOID なので、とりあえずは単純に以下のように void* p; としてみました。

【C++コード】
FTD2XX_API
FT_STATUS WINAPI FT_OpenEx(
    PVOID pArg1,		//←この部分が問題の箇所です
    DWORD Flags,
    FT_HANDLE *pHandle
    );

       ↓↓↓

【C#コード】
[DllImport("ftd2xx.dll")]
unsafe private static extern UInt32 FT_OpenEx(
	void* pArg1,	//←このように書き換えました
	UInt32 Flags,
	UInt32* pHandle);

C++のコードには、以下のような記述がありますので、C#でも同様に試してみたのですが、
「引数'1': 'string'から'void'に変換できません。」というようにエラーがでてしまいます。

ftStatus = FT_OpenEx("ASB-004-TEST08", 1, &ftHandle);

PVOIDを void* に書き換えただけでは駄目なのでしょうか。
何かお気づきの点がありましたら、アドバイスをいただけたら助かります。
よろしくお願いします。


引用返信 編集キー/
■57408 / inTopicNo.2)  Re[1]: void型へのポインタ
□投稿者/ 魔界の仮面弁士 (2102回)-(2011/02/25(Fri) 12:46:11)
2011/02/25(Fri) 12:57:54 編集(投稿者)

No57406 (いちろう さん) に返信
> PVOID なので、とりあえずは単純に以下のように void* p; としてみました。
今回のケースでは、unsafe にする必要は無いと思います。
ftd2xx.dll は使ったことが無いですが、おそらくは (string, uint, ref IntPtr) で良いかと。

というか、FTD2XX_NET.DLL を参照設定した方が早い気も。
(いずれにしても、私は使ったことが無いのですが)

> void* pArg1, //←このように書き換えました
> ftStatus = FT_OpenEx("ASB-004-TEST08", 1, &ftHandle);
どうしても文字列を void* にしたいなら、fixed ブロックで string を char* にして、
それを void* にするという流れになります。ただしこれだと、ポインタの中身が
UCS-2 相当のバイナリになるため、たとえば ASCII 文字列が必要な場合には
System.Text.Encoding.ASCII.GetBytes で byte[] 化する必要があるかと思います。
そこから、byte[] を byte* や void* にする事もできますが…方向性が間違ってる気も。
引用返信 編集キー/
■57409 / inTopicNo.3)  Re[2]: void型へのポインタ
□投稿者/ 774RR (575回)-(2011/02/25(Fri) 13:09:57)
C/C++ で void* ということは「何であれ、ポインタ値を受け付ける」の意味。
C/C++ 側ソースコードで
> ftStatus = FT_OpenEx("ASB-004-TEST08", 1, &ftHandle);
のように使っているだけ、他のポインタ値を渡す状況が絶対無いのであれば
それはそもそも、元ソースは本質的に char* であるべきだったということ。
それならば string → Encoding を ASCII/CP932 に変換して渡すべき代物ということになる。

void* が文字列以外を受け取ることがあるなら unsafe が必要かも・・・
なんにせよその FTD2xx の仕様しだい。

FTD2xx って
http://www.ftdichip.com/Support/Documents/ProgramGuides.htm
http://sourceforge.jp/projects/sfnet_ftd2xx/
あたりの代物?

前者なら ASCII 文字列以外を渡す状況があるっぽい・・・
引用返信 編集キー/
■57412 / inTopicNo.4)  Re[3]: void型へのポインタ
□投稿者/ いちろう (5回)-(2011/02/25(Fri) 13:49:22)
魔界の仮面弁士さん、 774RR さん 回答ありがとうございます。


●以前、以下のような操作方法で参照設定は試してみたのですが、エラーがでてしまいました。
(操作方法)
・ソリューションエクスプローラの参照設定を右クリックして、参照の追加フォームを開く
・参照タブから ftd2xx.dll を選択し、読み込みを行う

(エラー内容)
「参照を追加できませんでした。ファイルにアクセスできて、有効なアセンブリであること、またはCOMコンポーネントで
 あることを確認してください」

また、他のHPを見てみても、プログラム中に[DllImport("ftd2xx.dll")]というようになってましたので、
参照設定はできないものなのだと思っております。



他のHPの例(C++)では、第一引数に portName.c_str() というように渡している例がありました。
c_str()は、string型で管理している文字列を、char*型を要求する関数に渡すような場合に使用する
ということでした。


●使用しているのは、FTDI社のUSB・パラレル変換IC FT245RLです。

まだはっきりと納得できないので、もう少し調べてみます。


(ドライバー説明から抜粋)
FT_OpenEx

デバイスとの通信をオープンしてこの後のアクセスのためのハンドルを返します。
シリアル番号やデバイス製品情報を指定して複数のデバイスから選択したものをオープンします

Syntax FT_STATUS FT_OpenEx ( PVOID pvArg1, DWORD dwFlags, FT_HANDLE *ftHandle )

パラメータ
pvArg1 PVOID:    通常はNullターミネーションのC文字列が格納されている
          アドレスを指していますが、dwFlagsの値によって意味が変わります
dwFlags DWORD:   FT_OPEN_BY_SERIAL_NUMBER か FT_OPEN_BY_DESCRIPTIONを指定します
ftHandle FT_HANDLE *:ハンドルが格納される FT_HANDLE 型変数へのポインター

引用返信 編集キー/
■57413 / inTopicNo.5)  Re[3]: void型へのポインタ
□投稿者/ 魔界の仮面弁士 (2104回)-(2011/02/25(Fri) 13:52:13)
No57409 (774RR さん) に返信
> void* が文字列以外を受け取ることがあるなら unsafe が必要かも・・・
その場合でも、ポインタを渡すのではなく、渡すデータ型ごとに
オーバーロードする事で対応した方が良い気がします。

型を事前に決定できないなら、object または IntPtr あるいは
byte[] 等を利用するという手もありますが…マーシャリングが面倒かも。
引用返信 編集キー/
■57414 / inTopicNo.6)  Re[4]: void型へのポインタ
□投稿者/ 魔界の仮面弁士 (2105回)-(2011/02/25(Fri) 13:59:04)
No57412 (いちろう さん) に返信
>> というか、FTD2XX_NET.DLL を参照設定した方が早い気も。
> また、他のHPを見てみても、プログラム中に[DllImport("ftd2xx.dll")]というようになってましたので、
> 参照設定はできないものなのだと思っております。

ftd2xx.dll は参照設定できません。
FTD2XX_NET.DLL などといった「ftd2xx.dll を呼び出すための .NET 用 ラッパーDLL」を参照設定してください。

774RR さんが提示してくださったサイトにもあったはず。
http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples/CSharp.htm

もちろん、そうしたラッパーDLLを利用せずに、自分で DllImportAttribute しても良いですが、
いずれにしても、unsafe の利用は可能な限り避けるべきかと。
引用返信 編集キー/
■57416 / inTopicNo.7)  Re[5]: void型へのポインタ
□投稿者/ いちろう (6回)-(2011/02/25(Fri) 14:25:31)
お世話になってます。

>FTD2XX_NET.DLL などといった「ftd2xx.dll を呼び出すための .NET 用 ラッパーDLL」を参照設定してください。
ラッパーDLLを試してみたところ、すんなりうまくいきました。
ありがとうございました。
助かりました!

引用返信 編集キー/
■57417 / inTopicNo.8)  Re[6]: void型へのポインタ
□投稿者/ いちろう (7回)-(2011/02/25(Fri) 14:26:10)
解決済みにチェックうつのを忘れてしまいました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -