ページ 1 / 1
C++のDLLをC#で使う
Posted: 2015年5月24日(日) 20:24
by akai777suzu
今現在
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#で使うにはどのようにしたらよいのでしょうか。
Re: C++のDLLをC#で使う
Posted: 2015年5月24日(日) 23:33
by lriki
Aloha_Callback_t の宣言はここに載せられませんか? doc ファイルの中には見当たりませんでした。(SDK をインストールしなければならないのでしょうか…)
とりあえず、似たような引数や振る舞いをする WinAPI を C# から呼び出す方法が参考になると思います。
例えば…
・SendMessage() … WPARAM/LPARAM を引数にとる
・EnumWindows() … コールバック関数を使う
・GetCurrentDirectory() … 文字列を取得する
「C# API名」や「C# PInvoke API名」で検索するといろいろヒットします。
Re: C++のDLLをC#で使う
Posted: 2015年5月25日(月) 00:17
by akai777suzu
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で定義されるエラー番号。
Re: C++のDLLをC#で使う
Posted: 2015年5月25日(月) 08:20
by naohiro19
- COM形式(ATLプロジェクト)のDLLを参照して呼び出す
- C++/CLIでラッピングして呼び出す
- DllImport属性(System.Runtime.InteropServices名前空間)を利用し、その関数が外部にあることをあらかじめ宣言して使用する
の3つがあります。
C#で呼び出す対応する型は以下のページにあります。
http://www.codeproject.com/Articles/971 ... I-C-to-NET
Re: C++のDLLをC#で使う
Posted: 2015年5月25日(月) 14:00
by YuO
void *はたいていの場合,専用の型ごとのオーバーロードを用意するのが楽です。
IntPtrにしておいてMarshal系と組み合わせたり,unsafeコードとポインタを使ってもできますが……。
関数ポインタ型は通常はデリゲート型に変換します。
詳しくはMSDNの
相互運用マーシャリングのページを参照してください。
オフトピック
特にコールバックがかかるような場合は,それなりの知識がないとエラーが頻発すると思います。
C/C++とC#についての知識次第で,どこまで説明がいるかも変わりますし。
Re: C++のDLLをC#で使う
Posted: 2015年5月25日(月) 17:19
by Aozora0630
あまり関係ないのかもしれませんが、C#は使わないので分かりませんが、.NET系なので同じかもしれないのでVBの場合のやり方を描きます。
VBノ例(AquesTalkを呼び出した)
コード:
Private Declare Function AquesTalkDa_PlaySync Lib "AquesTalkDa"(ByVal pstrKoe As String, ByVal pintSpeed As Integer) As Integer
又、Libのところは文字列定数しか受け付けません。
参考になれば・・・。
Re: C++のDLLをC#で使う
Posted: 2015年5月26日(火) 17:46
by akai777suzu
>>みなさん
考えてみましたがわかりませんでした。
今度は視点を変えてC++のコードがセットアップした中に入っていたので、そのコードをC++で書いて何かしらの方法でC#に渡すプログラムに書き換えてみようと思います。
相当遠回りですがその方法に決めました。
返信をいただいた方ありがとうございました。