- ベストアンサー
VC6.0で作ったライブラリをVBで呼び出したい
Vc++6.0で作ったライブラリをVBで呼び出そうとしています。 void*型の引数を呼び込みたいのですが、宣言部でどのように書けばよいのでしょうか? 呼び出し時引数をどのような形で渡せば良いのでしょうか? また返り値をPVOID型とするとどのように宣言部で書いて、呼び出したらよいのでしょうか? 例 void DeleteDllClass( PVOID oBj );という関数を VBから呼び出すと? PVOID CreateDllClass();をVBから呼び出すと? 調べてみましたがイマイチ分からなくて・・・・
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
新たな関数が出てきましたね・・・ そのCreateDllClassで作成したオブジェクトはポインタのままの利用であれば、全てLongで事が足りると思います。 Private Declare Sub CreateDllClass Lib "C製.DLL" (ByRef pObj As Long) Private Declare Sub DeleteDllClass Lib "C製.DLL" (ByVal pObj As Long) Sub Test() Dim l_ptr As Long Call CreateDllClass(l_ptr) Call DeleteDllClass(l_ptr) End Sub また、別途オブジェクト変数を宣言し利用しているのであれば Private Declare Sub CreateDllClass Lib "C製.DLL" (ByRef pObj As Any) Private Declare Sub DeleteDllClass Lib "C製.DLL" (ByVal pObj As Long) Sub Test() Dim l_obj As Object Call CreateDllClass(l_obj) Call DeleteDllClass(ObjPtr(l_obj)) End Sub などなど、、、、、 未検証なので、多少間違いはあるかもしれませんが、方向は違っていないはず^^; >さすがにVBにはポインタという概念がない?からむりでしょうか? 「ポインタ=番地」 という概念さえ持っていれば、VBでも応用はいくらでも利きます。 今回質問者さんは、Cの宣言だけを公開して質問されていますが、インターフェースを通じて取得した「物」で何をするかで、VB側で最も適した処理方法が異なると思います。 部分的に公開して質問されても、マクロ的に「Longで宣言」という変換方法以上のことは、言うことができません。 http://okwave.jp/kotaeru.php3?q=1267832
その他の回答 (3)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>とある取引先~Cで作りました。 ふむふむ >しかし取引先はおそらくCを使ってないかと思います。 !! >なのでVBのサンプルをつけておけば分かりやすいだろうし(うちへの質問も減る)と思っています。 なるほどです。苦労がよくわかります。 ノウハウの伝達は口頭や書面より、「動くサンプル」がベストですもんね^^ >何とかできました。 レスがないので、不安だったのですが、いい結果を聞くことができて非常にうれしいですよー お互い、今後も多種多様なスキルアップに努めていきましょうね! それでは^-^
お礼
ありがとうございます。 無事、客先にサンプルを出すことが出来ました。 客先が米国なので出来るだけ質問が来ないことを祈っているのですが(笑) そもそもアプリをActiveXで使えるようにしろ、そんなの簡単だろという依頼でしたし・・・
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>MFC Classを削除 オリジナルの開発環境構成ツールかな?(と勝手に推測と・・・) 私が知りたいのは 「DeleteDllClass」の機能というより、「DeleteDllClass」の引数の意味です^^ http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_getexitcodeprocess.htm を見ると、引数の一つ一つに意味が記されていますよね? このように、関数本体の機能も大事ですが、インターフェースの意味が最も重要なのです。 でも解決したっぽいのでよかったです。 あーだこーだと言っておりますが、今度似た様な事がありましたら、質問をする際の参考にしてもらえたら幸いです。 さらに参考までにですが、Cがアドレスを求めているのであれば、全てLongで切ることが可能です。 ※「全てLongにするべき」と言っているわけではありません。 #1でも述べたように「varptr,objptr,strptr」で、渡す変数のアドレスを求める事ができます。 これらを覚えていたら、VB6⇒C製.dllの呼び出しは、ほぼ可能だと思います。 ただ、汎用的にしたいのであれば、全てAnyで切ってしまえば100%と言っていいぐらい可能かと、、、 それをどう利用するかは、その都度DLLの特性を調べる必要がありますが^^;
お礼
ありがとうございます。 DeleteDllClassの引数の意味はオブジェクトへのCreateDllClassで作成したクラスへのポインタの意味でした。 取引先より特定機能をライブラリ化したものが欲しいといわれまして。 ちなみに ともに引数はクラスへのポインタとしたとき void CreateDllClass( PVOID * pObj ); void DeleteDllClass( PVOID pObj ); とすると、 CreateDllClassで作ったPVOID * pObj の値を DeleteDllClassの引数に渡すにはどうすればよいのでしょう? さすがにVBにはポインタという概念がない?からむりでしょうか?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
結果をいうと、変数のポインタを渡せばいいだけなのですが、、、 そのCで作られたDLLに、VB側からどのような型の変数を渡すつもりですか? longで宣言をしておいて、varptr,objptr,strptrのいずれかを利用するか、anyで宣言をしておいて、オブジェクト変数をそのまま渡せばよいようなパターンも想像できます。 なので、そのDLLの仕様がわからなければ、答えようがありません。
お礼
ありがとうございます。 オブジェクトへのポインタってどういう変数にするか迷ってまして。 long型で出来ました。 ちなみに CreateDllClassでMFC Classを作成し,DeleteDllClassでMFC Classを削除するという構成にしています。
お礼
ありがとうございます。 とある取引先にあるアプリを提供したのですがその機能をライブラリ化して欲しいと頼まれました。 スレッドを立ち上げて複数のRWにアクセスするのでCのほうが早く作りやすいのでCで作りました。 しかし取引先はおそらくCを使ってないかと思います。 なのでVBのサンプルをつけておけば分かりやすいだろうし(うちへの質問も減る)と思っています。 関数は (1)DLLクラス作成関数 (2)DLLクラス削除関数 (3)RWからICのデータを読み込む (4)ICのデータをCSVに出力する 機能を持ち、(3)のデータをDLLクラス内で保持し(4)で出力できるようにしたいと思っています。 なので (1)VOID CreateDllClass(PVOID *DllClass); (2)VOID DeleteDllClass(PVOID *DllClass); (3)LONG ReadData(PVOID *DllClass); (4)LONG OutputCsvFile(PVOID *DllClass); というインターフェースにしました。 ((3)(4)の返り値は実行結果) これをVBで呼び出すのに苦労していました。 アドバイスのおかげで何とかできました。 DeleteDllClassの引数の意味はオブジェクトへのCreateDllClassで作成したクラスへのポインタの意味でした。 取引先より特定機能をライブラリ化したものが欲しいといわれまして。 ちなみに ともに引数はクラスへのポインタとしたとき void CreateDllClass( PVOID * pObj ); void DeleteDllClass( PVOID pObj );