- PR -

C#→ASP.NET 時のMFC_DLLコールの方法

投稿者投稿内容
しん
会議室デビュー日: 2003/11/29
投稿数: 7
お住まい・勤務地: 埼玉県川口市
投稿日時: 2003-11-29 10:20
初めて投稿させて頂きます。今後ともよろしくお願いします。
早速ですが、
今、C#でASP.NETWebアプリケーションで
MFCで作成したDLLをコールする方法はどうしたらよいのでしょうか?
通常、下の記述のようにすればいいと思うのですが、
[DllImport("myDll_Test1.DLL", CharSet=CharSet.Ansi)]
public static extern int testMessage( StringBuilder ansMes );
呼ぶことができません。
参照設定など、他の方法で
DLL側を変更しても、インターフェースが変わらなければ
呼び側をリビルドしないですむ方法がありましたら、あわせて教えてください。

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-29 20:00
 「呼ぶことができません」ということから、
・セキュリティーの問題でコールできない
・パスが通っていないのでコールできない
・DLLの作り方がまずいのでコールできない
ざっと3つ考えられるのですが、どれが発生していますか?エラー番号やエラーメッセージは記述していただけないと、何が発生しているのか、選択肢が多すぎて困ります。
しん
会議室デビュー日: 2003/11/29
投稿数: 7
お住まい・勤務地: 埼玉県川口市
投稿日時: 2003-11-29 22:15
引用:

Jittaさんの書き込み (2003-11-29 20:00) より:
 「呼ぶことができません」ということから、
・セキュリティーの問題でコールできない
・パスが通っていないのでコールできない
・DLLの作り方がまずいのでコールできない
ざっと3つ考えられるのですが、どれが発生していますか?エラー番号やエラーメッセージは記述していただけないと、何が発生しているのか、選択肢が多すぎて困ります。


返答ありがとうございます。
言葉足らずですみません。。
テスト方法としては、用意したDLLをWebフォームからボタンを押すと
ただ呼ぶだけの処理を作成して、
StringBuilder s = new StringBuilder("aaa");
testMessage( s );
のようにコールしているのですが、
ボタンを押した後に、ブラウザの次画面を探している最中で
下のゲージが止まって見える状態(重いページを開いているときのような状態)
になってしまいます。
DLLの場所は
http://localhost/myDLL/myDll_Test1.DLL
コールするプログラムは
http://localhost/WebApplication2/WebForm1.aspx
にあります。
・セキュリティーの問題の場合、どこを注視すればよいでしょうか?
・パス設定を行う必要があるのでしょうか?
・DLLの作り方については、MFC→MFC.DLL はOKです。
よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-30 08:38
こんにちわ。諸農です。

引用:

しんさんの書き込み (2003-11-29 22:15) より:

・セキュリティーの問題の場合、どこを注視すればよいでしょうか?
・パス設定を行う必要があるのでしょうか?
・DLLの作り方については、MFC→MFC.DLL はOKです。



ASP.NETでのセキュリティについては良くわからないのですが、
問題の切り分けとして以下のことを試されてみてはいかがでしょうか。

1.Windowsフォームアプリから、当該のDLL関数を正常に呼べるかどうか。
  このときDLLがWindowsフォームアプリと同じフォルダに存在しない場合、
  DLLの存在場所に対して環境変数のパスが通っていなければ呼び出せません。

  #仮想ディレクトリも別々になっているようですので、このあたりが
   問題になっているのかもしれませんね。
   (Jittaさんご指摘の2番目の問題を解決する必要あり)

2.DLLのパスが解決できているとして、Winフォームアプリケーションからの
  関数呼び出しは正常に終了しているか、失敗しているかどうか。

  #呼び出しが失敗しているのであれば、DLL関数のプロトタイプの指定を
   変更する必要があるかもしれません。
   また、DLL関数内部の処理を見直す必要があるかもしれません。
   (Jittaさんご指摘の3番目の問題を解決する必要あり)

3.ASP.NETでのセキュリティ、パスの問題について調査・検討に入る
  (Jittaさんご指摘の1番目の問題を解決する必要あり)

ではでは(^^)/

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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
しん
会議室デビュー日: 2003/11/29
投稿数: 7
お住まい・勤務地: 埼玉県川口市
投稿日時: 2003-11-30 12:50
返答ありがとうございます。
MFC→LoadLibraryでの関数コールはできました。
いろいろな所において(同一フォルダ含む)をやったのですが、やはり前回同様の
状態になってしまいます。
やりたいことは
静的にリンクしてDLLをコールするのではなく、
動的に前のCの様に(LoadLibraryみたいに)コールしたいです。
DLLはMFC、WEBフォームはC#…
簡単にできる方法を教えてください。。

「教えてください」ばかりで申し訳ありませんが、よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-30 14:39
こんにちわ。諸農です。

引用:

しんさんの書き込み (2003-11-30 12:50) より:

MFC→LoadLibraryでの関数コールはできました。



なにか勘違いされている、または、こちらの意図が
伝わっていないようですが。。。

LoadLibraryってネイティブアプリでの利用方法であって、
しかもDLLのパス指定で行いませんか??

.NETでのDLL関数の呼び出しについての次のトピックは
参考になりませんか?

「アンマネージ DLL 関数の処理」
ms-help://MS.NETFrameworkSDKv1.1.JA/cpguidenf/html/cpconconsumingunmanageddllfunctions.htm

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
しん
会議室デビュー日: 2003/11/29
投稿数: 7
お住まい・勤務地: 埼玉県川口市
投稿日時: 2003-12-03 20:35
返答ありがとうございます。
HPを参考にもう少し、がんばってみます。

ありがとうございました。(解決時には返答します。。)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-04 09:07
引用:

しんさんの書き込み (2003-11-29 22:15) より:

テスト方法としては、用意したDLLをWebフォームからボタンを押すと
ただ呼ぶだけの処理を作成して、
StringBuilder s = new StringBuilder("aaa");
testMessage( s );
のようにコールしているのですが、
ボタンを押した後に、ブラウザの次画面を探している最中で
下のゲージが止まって見える状態(重いページを開いているときのような状態)
になってしまいます。


 この「testMessage」というのがDLL内の関数ですね。それでは、この関数は何をしますか?もしかして、メッセージウインドウを表示して、OKボタンがクリックされるまで待つ、とか?

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