今現在
http://www.nikko-ew.co.jp/cti/download.html
でDLしたC++のDLLを使用してナンバーディスプレイの値を取得しようと考えています。
ソースはDLL行の丸印をクリックするとダウンロードできます。
「アロハDLL ユーザーズ・マニュアル_第4.0版.doc」の中にDLL内で宣言されている関数が見ることができます。
例えば19-20ページの用にAloha_Callback_t変数やvoid*などといった変数をどのように宣言していけばいいのか
わかりません。
WPARAMのような変数であればIntPtrと書けばいいのだろうと思うのですかわかる方いらっしゃったら教えていただけ
ないでしょうか。
C#で使うにはどのようにしたらよいのでしょうか。
C++のDLLをC#で使う
Re: C++のDLLをC#で使う
Aloha_Callback_t の宣言はここに載せられませんか? doc ファイルの中には見当たりませんでした。(SDK をインストールしなければならないのでしょうか…)
とりあえず、似たような引数や振る舞いをする WinAPI を C# から呼び出す方法が参考になると思います。
例えば…
・SendMessage() … WPARAM/LPARAM を引数にとる
・EnumWindows() … コールバック関数を使う
・GetCurrentDirectory() … 文字列を取得する
「C# API名」や「C# PInvoke API名」で検索するといろいろヒットします。
とりあえず、似たような引数や振る舞いをする WinAPI を C# から呼び出す方法が参考になると思います。
例えば…
・SendMessage() … WPARAM/LPARAM を引数にとる
・EnumWindows() … コールバック関数を使う
・GetCurrentDirectory() … 文字列を取得する
「C# API名」や「C# PInvoke API名」で検索するといろいろヒットします。
-
- 記事: 31
- 登録日時: 9年前
Re: C++のDLLをC#で使う
DLLの行の○印をダウンロードすれば仕様書のようなものがあるはずです。
仕様書の内容は以下になります。
たぶんコールバック関数を使えばいいと思うのですが、よく考えたらどんな値を渡せばいいのかもわかりません。
概要: ホットプラグイベントに応じて、アロハへ接続または切断する
名称: Aloha_Hotplug
引数: No. 型 内容
1 WPARAM USB接続検出時にOSからアプリが受け取るWindowsメッセージの第1引数。
2 LPARAM USB接続検出時にOSからアプリが受け取るWindowsメッセージの第2引数。
3 Aloha_Callback_t 接続したアロハからのイベントを受け取るイベントハンドラへのポインタ。
または、イベントをポーリングで検出する場合はNULL。
4 void* イベントハンドラへ渡す追加引数。
戻り値: 型 値 内容
int 0~7 機器接続だった場合:
接続成功。値はAPI内部で管理する機器番号。
機器切断だった場合:
切断成功。
接続/切断イベントでなかった場合
常に0を戻す。
負 失敗。値はALOHA_ERROR_XXXXで定義されるエラー番号。
仕様書の内容は以下になります。
たぶんコールバック関数を使えばいいと思うのですが、よく考えたらどんな値を渡せばいいのかもわかりません。
概要: ホットプラグイベントに応じて、アロハへ接続または切断する
名称: Aloha_Hotplug
引数: No. 型 内容
1 WPARAM USB接続検出時にOSからアプリが受け取るWindowsメッセージの第1引数。
2 LPARAM USB接続検出時にOSからアプリが受け取るWindowsメッセージの第2引数。
3 Aloha_Callback_t 接続したアロハからのイベントを受け取るイベントハンドラへのポインタ。
または、イベントをポーリングで検出する場合はNULL。
4 void* イベントハンドラへ渡す追加引数。
戻り値: 型 値 内容
int 0~7 機器接続だった場合:
接続成功。値はAPI内部で管理する機器番号。
機器切断だった場合:
切断成功。
接続/切断イベントでなかった場合
常に0を戻す。
負 失敗。値はALOHA_ERROR_XXXXで定義されるエラー番号。
Re: C++のDLLをC#で使う
- COM形式(ATLプロジェクト)のDLLを参照して呼び出す
- C++/CLIでラッピングして呼び出す
- DllImport属性(System.Runtime.InteropServices名前空間)を利用し、その関数が外部にあることをあらかじめ宣言して使用する
C#で呼び出す対応する型は以下のページにあります。
http://www.codeproject.com/Articles/971 ... I-C-to-NET
最後に編集したユーザー naohiro19 on 2015年8月30日(日) 15:25 [ 編集 2 回目 ]
Re: C++のDLLをC#で使う
void *はたいていの場合,専用の型ごとのオーバーロードを用意するのが楽です。
IntPtrにしておいてMarshal系と組み合わせたり,unsafeコードとポインタを使ってもできますが……。
関数ポインタ型は通常はデリゲート型に変換します。
詳しくはMSDNの相互運用マーシャリングのページを参照してください。
IntPtrにしておいてMarshal系と組み合わせたり,unsafeコードとポインタを使ってもできますが……。
関数ポインタ型は通常はデリゲート型に変換します。
詳しくはMSDNの相互運用マーシャリングのページを参照してください。
オフトピック
特にコールバックがかかるような場合は,それなりの知識がないとエラーが頻発すると思います。
C/C++とC#についての知識次第で,どこまで説明がいるかも変わりますし。
C/C++とC#についての知識次第で,どこまで説明がいるかも変わりますし。
-
- 記事: 85
- 登録日時: 9年前
- 住所: 日本
- 連絡を取る:
-
- 記事: 31
- 登録日時: 9年前
Re: C++のDLLをC#で使う
>>みなさん
考えてみましたがわかりませんでした。
今度は視点を変えてC++のコードがセットアップした中に入っていたので、そのコードをC++で書いて何かしらの方法でC#に渡すプログラムに書き換えてみようと思います。
相当遠回りですがその方法に決めました。
返信をいただいた方ありがとうございました。
考えてみましたがわかりませんでした。
今度は視点を変えてC++のコードがセットアップした中に入っていたので、そのコードをC++で書いて何かしらの方法でC#に渡すプログラムに書き換えてみようと思います。
相当遠回りですがその方法に決めました。
返信をいただいた方ありがとうございました。