• ベストアンサー

VBから参照できないCのDLLを使用する方法

Cで作成されたDLLがあるのですが、VBから参照設定しても「指定されたファイルへの参照は登録できません。」と怒られます。 そのようなDLLをどうしてもVBから使用したい場合はどうすれば良いでしょうか? 直接は無理だとしても、間に何かをかましてできると思うのですが、良い方法があれば教えてください。 ちなみに VB6 です。 よろしくお願いします。

  • rally
  • お礼率61% (339/553)

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.5

>あります。 >とりあえず、DLLファイルと同様に C:\WINNT\System32 フォルダへ格納しました。 となるとやはりVBから直に呼び出すことはできません。 DLLでもスタティックリンクで使うものがあり VC++からは呼び出すことができます。 そこでVBから呼び出すには間にクッションをおく必要があります。 VB←VC++で作ったDLLを呼び出すDLL(クッション)←元のDLL .hや.libはVC++でスタティックリンクする際に必要となる ファイルでVBからは使用できません。

その他の回答 (4)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

***.dllの他に***.hとか***.libとかついてなかったですか?

rally
質問者

お礼

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 「しました」というか、既に「しています」です。

rally
質問者

補足

あります。 とりあえず、DLLファイルと同様に C:\WINNT\System32 フォルダへ格納しました。

  • run_away
  • ベストアンサー率42% (8/19)
回答No.3

ちょっと古い情報ですが、URL載せておきます。 「VBから呼出可能なようにDLLを作る」ということがなされているかどうかを確認してください。 Declareを使っても呼び出せないものもあります。 間に何かかませるとしたら、ActiveXのラッパーなどをかませればVBから呼び出せるようになりますが、これはC/C++でつくる必要がありますからねぇ。手間はあまり変わらないでしょう。 また、DLLが他のDLLを参照している場合、実行時エラー53がでることもあるのでそちらの線も洗ってみてください。

参考URL:
http://homepage2.nifty.com/DSS/VCPP/DLL/dllvbcall2.htm
noname#4564
noname#4564
回答No.2

  > 実行時エラー'53': > ファイルが見つかりません:hoge.dll パスが通ってないだけでしょう。 hoge.dllを下記のどこかに移動してみては? (1) %SystemRoot% (2) %SystemRoot%\System32 (3) %SystemRoot%\System (4) %Path% のどこか (5) App.Path  

rally
質問者

補足

何度もありがとうございます。最後までお付き合いください。m(_ _)m > パスが通ってないだけでしょう。 > hoge.dllを下記のどこかに移動してみては? こちらで試したことを書くべきでした。 そう思いまして、C:\WINNT\System32 においてみましたが、同じなのです。 フルパス指定でも同じでした。 DLLはDeclareすれば、必ず使えるものなのでしょうか?

noname#4564
noname#4564
回答No.1

  (1) そのDLLがCOM(ActiveX)コンポーネントなら、   RegSvr32 "DriveName:\....Path....\FileName"   を実行してみる。 (2) COMでないなら、Declare 宣言する。

rally
質問者

補足

> (1) そのDLLがCOM(ActiveX)コンポーネントなら、   RegSvr32 "DriveName:\....Path....\FileName"   を実行してみる。 COMコンポーネントではありません。 試しにやってみましたが、以下のエラーになりました。 LoadLibrary("C:\WINNT\System32\hoge.dll")failed - 指定されたモジュールが見つかりません。 > (2) COMでないなら、Declare 宣言する。 これもやってみたのですが、エラーになるのです。 実行時エラー'53': ファイルが見つかりません:hoge.dll DLLはDeclareすれば、必ず使えるものなのでしょうか?

関連するQ&A

  • c++のdllが参照できません

    c++で作成したDLLをVBから参照したいのですが、 VBでの宣言はうまくいっていて自分の端末では動作するのに 他のPCではDLLがありませんとエラーがでるのですが System32の直下にDLLはありsystem32直下の他のC++のDLLは参照できるのに 今回新規で作成したものに関してうまくVBがDLLをみつけることが できません 条件は自分の端末とあわせました。 パスの指定など必要なのでしょうか? アドバイスください

  • VB2008でのDLL作成方法について

    はじめまして、はじめて投稿します。 初心者なので変な質問をしていたらすいません。VB2008を使用しています。 VBで作成したDLLファイルをLabviewで使用したいと思っています。 ただVB6.0でActiveX DLLを作成する方法はわかるのですが、VB2008で作成する方法がわかりません。 クラスライブラリでプログラムを作成し、DLLにすることはできるのです・ しかしレジストリに登録しようと思い「regsvr32 ファイルのパス**.dll」と入力したところ「**.dllは読み込まれましたが、DllRegisterServerエントリポイントが見つかりませんでした」と出ます。 調べてもVB2008でのActiveX DLL作成方法が見つからなくて困っています!!! わかるかた、よろしくお願いいたします。

  • VB6から参照可能なDLLの作成

    VB6から参照可能なDLLの作成を参考書をみながらしましたが、上手くいかない為質問させていただきます。 開発環境VC++ 2005 C++ CTEST.dll #include <windows.h> __declspec (dllexport) int __stdcall test(int i) { i = i + 5; return i; } .defファイル LIBRARY "test" DESCRIPTION EXPORTS A 以上でDLLを作成し、VB6側で Private Declare test Lib "CTEST.dll" (ByVal i as integer) で宣言しても「エラー53 ファイルがみつかりません」と表示されます。「参照の追加」から参照しようとしても「このファイルは参照できません。」をエラーがでてしまいます。 直すべき点はどの部分なのでしょうか? ご教示ねがいます。

  • VB 2008 DLL作成の方法

    当方Visual Studio 2008のVB、C++で開発をしています。 VS2008のVBでクラスライブラリとして作成し、ビルドをしてDLLを作成したのですが、 対となるLIBファイルがどこにも見当たりませんでした。 VS6.0のVBではLIBファイルも作成されました。 VS2008のVBでLIBファイルを作成する方法をご存知の方いらっしゃいましたら教えてください。 LIBファイルを使用する理由は、VBで作成したDLLをC++に組み込むときにリンクさせる為です。 ※今回はLoadLibrary関数を使わず、LIBファイルを使おうと考えています 以上、宜しくお願い致します。

  • VC++のDLLをVB6.0からVB.NETへ移行する方法

    はじめて投稿します。 今、現状VB6.0のプログラムで使用しているVC++のDLLを VB.NETで使用できるように、VB.NETのソースの改修をしています。 (開発環境は、VisualStudio.NET 2003) たいていのDLLは、DllImportを行うことで VB.NETから使用できることを確認しました。 /*--(例)------------------------------------------*/ Imports System.Runtime.InteropServices <DllImport("DLLTest.dll")> _ Private Shared Function DLLTestMethod() As Integer End Function /*------------------------------------------------*/ しかし、苦戦しているDLLファイルがあって、 そのソースを見ると、COMで実装されているようで、 コンパイルしたらタイプライブラリファイルが作成されています。 またDLLのレジストリも登録されているようです。 VB6.0でどう使われているか確認したところ、 そのDLLの参照設定をしていて、 "Public obj As New クラス名"でクラス宣言した後、 obj.関数名()で処理を行っています。 VB.NETでいろいろ試行錯誤してみましたが 参照設定はできるものの、その後で手詰まりになっています。 (参照設定しても、灰色になっているクラス名が存在するので 正しく設定できているかも怪しい状態) (1)----------------------------------------------- 参照設定後、オブジェクトブラウザから見えるクラスをNewして そのメンバ関数を使用する方法 -------------------------------------------------- (結果) レジストリ登録をしていないと 「CLSID{・・・}のCOMオブジェクトが有効でない」云々というエラーに。 それを受けて手動で該当するDLLのレジストリ登録を行った後だと 「オブジェクト参照がオブジェクトインスタンスに設定されません」というエラー。 (ということは、クラス生成に失敗している?) (2)----------------------------------------------- 上記のようにDllImportで実装する方法 (ちなみにそのDLLがエクスポートしている関数は DllCanUnloadNow, DllGetClassObject, DllRegisterServer, DllUnregisterServerの4つ) -------------------------------------------------- (結果) DllGetClassObject以外については関数を呼ぶことができている。 DllGetClassObjectは、引数設定に苦戦して今のところうまくいっていない状態。 (3)----------------------------------------------- インスタンス生成ができていないようなので どこかで調べて見つけてきたCoCreateInstance関数を使用する方法 -------------------------------------------------- (結果) これも引数に何を渡してよいかわからず試行錯誤中。 DLLの読み込みの時点でこけているかと予測して そのあたりが解決すればよいのかな・・・といろいろ試していますが WindowsプログラミングやCOMがよくわかっていないので 何が正解で何が間違っているのかさっぱりわからず、 周りに聞いても精通している人がいないためどうしようもなくなっています。 どんな些細な手がかりでもよいので 突破口になりそうなアドバイスがあれば教えてください。 よろしくお願いします。

  • VB2005で作成したDLLをExcelVBAで使用したいのですが

    VBAで色々定義してもまったく使用できません。 作成したDLLをDependencyWalkerで覗くとFunction名が出ていないので、うまくDLLができていないと思うのですが、何が問題なのでしょうか? C++等でようなDEFファイルのようなものは定義していません。 (VBでの定義がわかりません)よろしく御願いします。

  • VB.NETで参照設定

    Visual Basic .NET について質問致します。 VB 6.0は使用していたのですが、.NETに関して初心者です。 VSSにてファイル管理をしています。 共通で使用するためののオリジナルDLLを作成し 参照設定をしているのですが、参照パスがフルパスで設定されているため (プロジェクトのプロパティページの「参照パス」のフォルダのところ) VSSから最新プロジェクトファイルを取得した後 いつも参照パスを自分のローカルのパスに変更しなおさなければいけません。 とても効率が悪く、もっといい方法があるかと思うのですが、 教えていただきますようお願い致します。

  • VB.NETで、DLLを頂いたんですが・・

    VB.NETでプログラムを作成しているのですが、 DLLを頂きました。 このDLLをプログラムで使いたいのですがよくわかりません。 (1)DLLは実行ファイルにおけばいいんですよね? (2)DLLを参照しろっていう設定は必要ですか? (3)DLLには、プロパティ、メソッド、イベントとあるみたいなんですが、これらを宣言しないといけないと思うのですがどうやればいいのでしょうか? (4)下のような資料もらったのですがVBcnvというのが定義されていないとエラーがでるのですがどうやって宣言するのでしょう? private <任意名> as VBcnv (5)libファイルも一緒にあったのですが、どういう風に使えばいいのでしょうか?何につかうのでしょうか? すいません、どなたかお助けを~

  • VB2010で作成したdllからtlbが作れない

    VB.NETで作成したDLLをExcelのVBAから呼び出すということをやっています。 VB2007のときはよかったのですが、VB2010にしてからうまくいかなくなりました。 具体的には、コンパイルしてClassLibrary1.dllファイルを作成してから C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe ClassLibrary1.dll /tlb:ClassLibrary1.tlb /codebase を実行すると、 ClassLibrary1.dllは有効な.NETアセンブリではないため、読み込めませんでした。 となります。 ClassLibrary1の「アセンブリをCOM参照可能にする」にはチェックを入れています。 おわかりの方がいらっしゃいましたら、どうぞよろしくお願いいたします。

  • DLLの登録をVBで行いたい(VB2005)

    いつもお世話になっております。 VB2005で開発しています。 DLLを登録するときに、コマンドプロンプトから regsrv32 ファイル名.dll と実行すると思います。 これをVBから行いたいのですが、何か良い方法はございませんか? 具体的には、VBでレジストリ登録するファイルの一覧を出力して、 それをレジストリ登録したいのです。 VBとバッチを組み合わせれば、実現可能なのですが、 ファイルを2つに分けたくないので、VBだけで処理できないものかと 思いました。 コマンドプロンプトで実行するコマンドをVBから同じように実行できれば良いのですが・・・ もしよろしければ、ご教示ください。 よろしくお願い致します。

専門家に質問してみよう