- PR -

VC++6.0で作成したDLLをVB.NETから利用したい

1
投稿者投稿内容
TY
会議室デビュー日: 2004/04/28
投稿数: 3
投稿日時: 2004-04-28 11:22
初めて投稿いたします.

今,自分がVB.NETで作ったアプリケーションから,他人がVC++6.0で作ったDLLを
利用したいと考えています.
(DLLのオリジナルソースではクラスが定義されていてこのオブジェクトを利用したい)

@
まず,呼び出す側(VB.NET)のプロジェクトで[参照の追加]を行おうとしたのですが
「有効なアセンブリまたはCOMオブジェクトではない」とのエラーが出ました.

A
単純なDLLの参照追加ではうまくいかないのか,と次に
http://www.microsoft.com/japan/msdn/net/upgrade/callcomcomp.asp
に従い,regsvr32でこのDLLを登録しようとしましたが,
「**.DLL was loaded, but the DLLRegisterServer entry point was not found.」
のエラーが出て登録できませんでした.

B
いろいろ調べたのですが混乱してきたので,DLLをそのまま使うのをあきらめ
DLLの作者からC++のソースコードやプロジェクト関係のファイル一式をとりよせ
これを.NET環境に変換ロードし,ビルドしてみました.
一応DLLができて,呼び出し側で[参照の追加]をやってみたのですが,やはり@Aと
同じ結果となりました.
ソースを見ると,このクラスがMFC拡張DLLであることがわかりました.
(だいたい,これはVB.NETから利用できるのでしょうか?)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_extension_dlls.asp

C
変換ロードしたC++.NETプロジェクトのプロパティでコンパイルオプションなどを
さわりながら試行錯誤を繰り返した結果,[構成プロパティ]-[全般]の
「マネージ拡張」を"はい"にしたら,ビルド時にワーニングは出るのですが,
呼び出し側で参照追加できることがわかりました.しかし,呼び出し側プロジェクトでは
DLL中のクラスが構造体として認識されているようです.
(ワーニングに問題?)

COM,MFC,マネージ拡張,アセンブリ,マーシャリング…
湯水のように現れる専門用語に混乱し,泥沼に入っています.
見当違いの難しいことをしているのかもしれません.
解決のヒントになるようなことがあれば教えてください.

ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-28 11:37
引用:

TYさんの書き込み (2004-04-28 11:22) より:

今,自分がVB.NETで作ったアプリケーションから,他人がVC++6.0で作ったDLLを
利用したいと考えています.


VC++6.0で作ったDLLは、普通はWindowsのAPIとかと同類です。

引用:

に従い,regsvr32でこのDLLを登録しようとしましたが,
「**.DLL was loaded, but the DLLRegisterServer entry point was not found.」
のエラーが出て登録できませんでした.


ですからコンポーネントではなさそうですし。

.NET TIPS Win32 APIやDLL関数を呼び出すには?を読んでみてください。
もちろん、関数や引数の詳細が分からないといけないので、DLLを作ったときのヘッダファイルを見ながら記述することになります。
また、VC++6.0の型とVB.NETの型の違いにも気をつける必要があります。

あと、実際に試してはいないので分かりませんが、DLL検索パスとかも考慮に入れる必要があるかも……。

他に、

も参照のこと。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-04-28 11:47 ]
TY
会議室デビュー日: 2004/04/28
投稿数: 3
投稿日時: 2004-04-28 12:08
ぢゃん♪様
早速のレスありがとうございます.

ご紹介いただいたページをまだじっくりと読んだわけではないのですが,
Win32APIやDLL関数は調査中に何度かお目にかかった言葉ではあるのですが,
「DLL中で定義された関数を使用する」というイメージがあります.
以前VB6からFortranDLL中のサブルーチンをコールしたことがありますが,
ご紹介いただいた方法はこれに近いかと(まさしくこれかもしれません).

この方法で,DLL中に書かれたクラスのオブジェクトを呼び出し側で
生成し,そのメソッドを利用することはできるのでしょうか?
ほや
会議室デビュー日: 2002/05/27
投稿数: 18
お住まい・勤務地: 関西
投稿日時: 2004-04-28 12:53
以前、同じようなことをしようとしたことがあります。
C#.NETからVC++6.0で作成したDLLのクラスライブラリを使う(C#でVC++で作った
クラスをnewするなど)ことがやりたかったのですが、結局、解決案が見つからなくて、クラスライブラリを使うことは断念しました。

つまるところ、
「関数定義をC#側で記述しなければいけない、ということは、ヘッダファイルを
読めないということか? だったら、クラスを使おうとしたら、クラス定義を
丸ごと記述しなければいけないのか? それは現実的じゃないな。やめよう。」
と思った次第です。
もし、使おうとしていらっしゃるクラスの機能が関数で提供できるようなもの
なら、VC++でWinAPIみたいな関数を用意してDLLに組み込み、それを呼び出す、
という手もありそうですが、クラスそのものをVB.NETから使うというのは、
難しそうですね。

回答になっていませんね。すみません。
TY
会議室デビュー日: 2004/04/28
投稿数: 3
投稿日時: 2004-04-30 09:02
ほや様,ありがとうございました.

書き込んだ後,会社でこういうことに関してよく知っている方にお会いしたので
質問してみたのですが,やっぱり無理(難しい?)みたいですね.

何か別の解決策を考えます.

ありがとうございました.
shiggy
常連さん
会議室デビュー日: 2004/03/22
投稿数: 33
投稿日時: 2004-04-30 12:26
Windows32 APIシステムプログラミング 北山洋幸著 カットシステムに詳しく記載されています。但し、実例サンプルも載っていますので、じっくり読めば解かります。
1

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