- PR -

C#からCで作成したダイアログ画面を呼び出す方法

投稿者投稿内容
YRENA
会議室デビュー日: 2004/01/20
投稿数: 12
投稿日時: 2004-02-10 19:45
C#からCで作成したDllを呼び出したいのですが、上手くいきません。

「Win32 APIやDLL関数を呼び出すには?」という .NET TIPSを参考にしています。
参考にしているプログラムと違うところは、Cで作成したプログラムが計算プロ
グラムではなくダイアログ画面であるというところです。

根本的な問題になりますが、
C#からCで作成したDLL(ダイアログ画面)を呼び出すことはできるので
しょうか。最終的にはダイアログ画面から値を取得してC#のプログラムで
計算をさせたいのですが…。

どなたか良いアドバイスをいただけませんか?宜しくお願い致します。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-10 20:16
諸農です。

引用:

C#からCで作成したDllを呼び出したいのですが、上手くいきません。



どのようにうまくいかないのでしょうか?

引用:

C#からCで作成したDLL(ダイアログ画面)を呼び出すことはできるので
しょうか。最終的にはダイアログ画面から値を取得してC#のプログラムで
計算をさせたいのですが…。



根本的な質問になりますが、

そのDLL関数を呼び出すことでダイアログが表示される仕様になっているのですか?
表示されるようになっているなら、関数を呼び出せば表示されます。

そのDLL関数を呼び出せば、関数の戻り値で関数で表示されたダイアログで入力され
た値を取得できる仕様になっているのですか?
取得できるようになっているのでしたら、戻り値を確認することで
C#(呼び出し側のアプリケーション)でその値を元に計算することは可能です。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
YRENA
会議室デビュー日: 2004/01/20
投稿数: 12
投稿日時: 2004-02-12 11:45
荒っぽい質問で申し訳ありませんでした。以下は補足です。

@C#からCで作成したDllを呼び出したいのですが、上手くいきません。
 ⇒デバック用に仕掛けたメッセージボックスは表示されるのですが、
  メイン画面が表示されないのです。
ADLL関数を呼び出すことでダイアログが表示される仕様になっています。
 また、関数の戻り値でダイアログで入力された値を取得できる仕様に
 なっています。しかし、現在はダイアログが表示されないので、入力
 に至っていない状況です。
BDLL関数を呼び出すときに引数を使います。
 直感なのですが、その引数が怪しいような気がします。というのは、
 引数の中のひとつに呼び出し側のインスタンスハンドルを必要としている
 ところがあり、これを「(IntPtr)0」と書いています。
 また、呼び出し側のコントロールのハンドルも引数としているのですが、
 これを
 IntPtr CallPgCtr = this.listBox10.Handle;
 のように取得しています。
 C#ではあまり使わないハンドルを使っていることが気になるのです。

引き続き調査いたしますが、何かご存知であれば教えてください。
 
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-12 21:29
諸農です。

引用:

@C#からCで作成したDllを呼び出したいのですが、上手くいきません。
 ⇒デバック用に仕掛けたメッセージボックスは表示されるのですが、
  メイン画面が表示されないのです。



.NETでない環境からは呼び出せることが確認できているのでしょうか?
デバッグ用のメッセージボックスってなんでしょうか?
対象となっているDLLが持つ別の関数ですか?

引用:

ADLL関数を呼び出すことでダイアログが表示される仕様になっています。
<省略します>
BDLL関数を呼び出すときに引数を使います。



利用するDLL関数の宣言とはどんなものでしょうか。
もし可能でしたらご提示ください。

また、現在までに行ったC#での呼び出しコードはどんなものでしょうか。
もしも可能でしたらご提示ください。


#見逃していました。すみませんm(__)m

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-02-13 08:22
コード:

IntPtr CallPgCtr = this.listBox10.Handle;


なぜ(フォームでなく)リストボックスのHWNDなのでしょうか?
それとも「listBox10という名前のForm」?

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-02-13 08:22 ]
YRENA
会議室デビュー日: 2004/01/20
投稿数: 12
投稿日時: 2004-02-13 11:43
ご返信ありがとうございます。

引用:

.NETでない環境からは呼び出せることが確認できているのでしょうか?
デバッグ用のメッセージボックスってなんでしょうか?
対象となっているDLLが持つ別の関数ですか?



.NETでない環境からの呼び出しは確認しております。
デバック用のメッセージボックスは↓↓↓です。
MessageBox(NULL,"処理中","テスト@",MB_OK);

引用:

利用するDLL関数の宣言とはどんなものでしょうか。
もし可能でしたらご提示ください。
また、現在までに行ったC#での呼び出しコードはどんなものでしょうか。



Cのプログラムでは下記の用に宣言されている関数を呼び出したいと思っています。
BOOL Ex_Select_Menu
(HINSTANCE hInstance, HWND hwnd, short kai_cd, char kbun,
HWND Menuhwnd, char pas, char *menu_cd, long vdate)

C#側の宣言は下記のようです。
public extern static bool Ex_Select_Menu
(System.IntPtr hInstance, System.IntPtr hwnd, short kai_cd, char kbun, System.IntPtr Menuhwnd, char pas, System.Text.StringBuilder menu_cd, int vdate);

呼び出し部分は下記です。
========================================================================
//C#画面のハンドルを取得
IntPtr oya = this.Handle;
//C#画面に貼り付けてあるリストボックスのハンドルを取得
IntPtr ko = this.MenuView.Handle;
//テスト用の仮文字列を代入
string menu_oya = "000000";
System.Text.StringBuilder menu = new System.Text.StringBuilder(menu_oya);
Ex_Select_Menu((IntPtr)0, oya, 1, '0', ko, '0', menu, 20040210);
=======================================================================

引用:

なぜ(フォームでなく)リストボックスのHWNDなのでしょうか?
それとも「listBox10という名前のForm」?



隠しリストボックスをC#のフォームに設けています。
Cで表示したいダイアログの中にリストボックスがあり、
そこで選択した項目をC#の隠しリストに持ってきたい
のです。

訂正 
引用:

ADLL関数を呼び出すことでダイアログが表示される仕様になっています。
 また、関数の戻り値でダイアログで入力された値を取得できる仕様に
 なっています。しかし、現在はダイアログが表示されないので、入力
 に至っていない状況です。


とありましたが、戻り値ではなくダイレクトに親画面の隠しリストに書込む
仕様です。ですので、C#で作った隠しリストに書き込みたいのです。

以上です。お詫びして訂正いたします。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-13 12:25
hInstanceを以下のように取得してみてはどうですか?

コード:
System.Reflection.Module module;
module = System.Reflection.Assembly.GetExecutingAssembly().GetModule();

System.IntPtr hInstance;
hInstance = System.Runtime.InteropServices.Marshal.GetHINSTANCE( module );


YRENA
会議室デビュー日: 2004/01/20
投稿数: 12
投稿日時: 2004-02-13 18:55
引用:

System.Reflection.Module module;
module = System.Reflection.Assembly.GetExecutingAssembly().GetModule();
System.IntPtr hInstance;
hInstance = System.Runtime.InteropServices.Marshal.GetHINSTANCE( module );



上記を記述してみましたが、状況は以前と変わらない状態です。

付け足しですがCで機能していないと思われる関数に下記があります。
コード:
DialogBox(hInstance, "MENU", hwnd, (DLGPROC)MenuDlgProc);


機能しないと思う根拠はMenuDlgProc内にメッセージボックスを
記述してみましたが、表示されなかったからです。
ちなみに第一引数、第三引数は
C#から渡している第一引数、第二引数をそのまま使用しています。

お手数かけますが、もう少し解決のヒントをいただけませんか?

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