C++のDLLをC#で使う

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
akai777suzu
記事: 31
登録日時: 9年前

C++のDLLをC#で使う

#1

投稿記事 by akai777suzu » 9年前

今現在
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#で使うにはどのようにしたらよいのでしょうか。

アバター
lriki
記事: 88
登録日時: 13年前

Re: C++のDLLをC#で使う

#2

投稿記事 by lriki » 9年前

Aloha_Callback_t の宣言はここに載せられませんか? doc ファイルの中には見当たりませんでした。(SDK をインストールしなければならないのでしょうか…)

とりあえず、似たような引数や振る舞いをする WinAPI を C# から呼び出す方法が参考になると思います。
例えば…
・SendMessage() … WPARAM/LPARAM を引数にとる
・EnumWindows() … コールバック関数を使う
・GetCurrentDirectory() … 文字列を取得する

「C# API名」や「C# PInvoke API名」で検索するといろいろヒットします。

akai777suzu
記事: 31
登録日時: 9年前

Re: C++のDLLをC#で使う

#3

投稿記事 by akai777suzu » 9年前

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で定義されるエラー番号。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: C++のDLLをC#で使う

#4

投稿記事 by naohiro19 » 9年前

  1. COM形式(ATLプロジェクト)のDLLを参照して呼び出す
  2. C++/CLIでラッピングして呼び出す
  3. DllImport属性(System.Runtime.InteropServices名前空間)を利用し、その関数が外部にあることをあらかじめ宣言して使用する
の3つがあります。

C#で呼び出す対応する型は以下のページにあります。
http://www.codeproject.com/Articles/971 ... I-C-to-NET
最後に編集したユーザー naohiro19 on 2015年8月30日(日) 15:25 [ 編集 2 回目 ]

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: C++のDLLをC#で使う

#5

投稿記事 by YuO » 9年前

void *はたいていの場合,専用の型ごとのオーバーロードを用意するのが楽です。
IntPtrにしておいてMarshal系と組み合わせたり,unsafeコードとポインタを使ってもできますが……。

関数ポインタ型は通常はデリゲート型に変換します。

詳しくはMSDNの相互運用マーシャリングのページを参照してください。
オフトピック
特にコールバックがかかるような場合は,それなりの知識がないとエラーが頻発すると思います。
C/C++とC#についての知識次第で,どこまで説明がいるかも変わりますし。

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: C++のDLLをC#で使う

#6

投稿記事 by Aozora0630 » 9年前

あまり関係ないのかもしれませんが、C#は使わないので分かりませんが、.NET系なので同じかもしれないのでVBの場合のやり方を描きます。

VBノ例(AquesTalkを呼び出した)

コード:

Private Declare Function AquesTalkDa_PlaySync Lib "AquesTalkDa"(ByVal pstrKoe As String, ByVal pintSpeed As Integer)  As Integer
又、Libのところは文字列定数しか受け付けません。

参考になれば・・・。

akai777suzu
記事: 31
登録日時: 9年前

Re: C++のDLLをC#で使う

#7

投稿記事 by akai777suzu » 9年前

>>みなさん
考えてみましたがわかりませんでした。
今度は視点を変えてC++のコードがセットアップした中に入っていたので、そのコードをC++で書いて何かしらの方法でC#に渡すプログラムに書き換えてみようと思います。
相当遠回りですがその方法に決めました。
返信をいただいた方ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る