• ベストアンサー

関数がDLLファイル内に見つかりません!

VC++で作成した関数をVB6.0で使おうとしたんですが、 タイトルのようなエラーになってしまいます。 関数名はあっています。 なにか考えられることはありますか?

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

  • ベストアンサー
  • haporun
  • ベストアンサー率40% (230/562)
回答No.3

xxxx.defというファイルがC++プロジェクト内にありますか? このファイルでエクスポートする関数を決定します。 このファイルは次のような書式です。 ------------------------- EXPORT HogeFunc1 HogeFunc2 HogeFunc3 ------------------------- このように先頭にEXPORTと書き、その下にエクスポーとしたい関数名を列挙したテキストファイルを、xxxx.defと名前を変えてプロジェクトに加えます。 それから、Cのint型はVBではLong型です。 ------------------------- Declare Function gGetA Lib "TEST.dll" _ (ByVal strDate As String) As Long ------------------------- おまけにVBはCの関数のデフォルト呼び出し規則の__cdeclは使えません。 __stdcallにする必要があります。 難しいことが分からなかったら、Cのほうを次のように書き換えてください。 ------------------------- extern "C" int __stdcall gGetA(char * date) { } ------------------------- あと、今回はいいですが、関数名の大文字小文字の区別にも気を付けてください。

wan-chan
質問者

補足

プロジェクト内にDefファイル? ありません。 プロジェクト内には、 TESTクラス   グローバル    gGetA しかありません。 >あと、今回はいいですが、関数名の大文字小文字の区別にも気を付けてくださ い。 どういうふうにするのが普通なんですか?

その他の回答 (6)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.7

C++のプロジェクトに先ほど言ったように、拡張子を.defにしたテキストファイルを加えます。 または、a-kumaさまの言うとおり、__declspecを使っても構いません。 好きな方をお勧めします。 >>あと、今回はいいですが、関数名の大文字小文字の区別にも気を付けてください。 >どういうふうにするのが普通なんですか? VBでは大文字と小文字の区別はありませんが、Declare Functionに指定する関数名だけは、大文字と区別を厳密に区別するので、C側で作った関数と大文字/小文字を統一しろと言うことです。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

サンプルを作ったのですが・・・ 電話ラッシュで、その間にいろいろ回答が書かれてますね。。。 かぶるかもしれませんが、一応書いておきます。 それと#5a-kumaさんの発言 >今時は def ファイルはなくてもエクスポートできます。 知りませんでした。 このサンプルは思いっきりdefを使ってます。 Cの構成 Testファイル ├Source File │├gGetA.cpp │└gGetALib.def │ └Header Files  └gGetA.H // gGetA.cpp #include <windows.h> #include "gGetA.h" __declspec( dllexport ) long __stdcall gGetA(char *Palam) { // テストのメッセージボックス MessageBox(0,Palam,"test_VC++",0); return 1; } // gGetALib.def LIBRARY gGetALib EXPORTS gGetA @1 // gGetA.H extern "C" __declspec( dllexport ) long __stdcall gGetA(char *Palam);

wan-chan
質問者

お礼

サンプルまで作っていただき、 本当にありがとうございます!! プロジェクトのClassViewしか見ていませんでした。 FileViewには、いろいろなファイルがありました。 今回は、defファイルを使わない方法でやってみます。 関数をエクスポートする必要があるんですね。 ほんと、初歩的なことも知らなくてごめんなさい。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

No.3 の回答にある通り、関数名(シンボル)がエクスポートされていないのが原因でしょう。 今時は def ファイルはなくてもエクスポートできます。 __declspec(dllexport) int __stdcall gGetA(char * date) {   なんとか } って感じかな。

wan-chan
質問者

補足

そのとおりに書いてみました。 結果は同じです・・・。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.4

そのまえに、C++プロジェクトで、Win32 Dynamic Link Libraryを選んでいますか? 普通DLLではstdlibなんてincludeしません。

wan-chan
質問者

補足

もちろん、それは選んでいます。 でも、stdlibをincludeしないとatoi関数がつかえなかったので。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

>関数がDLLファイル内に見つかりません >VC++で作成した関数をVB6.0で使おうとしたんですが 環境の問題でなければ、単にC作成のDLLがおかしいだけでは? 今までにDLLの作成経験があるのですか? もしそうならば、流用したらできると思いますが・・・ 最低でもインターフェイス部分だけでも公開しないと、なんとも言えません。

wan-chan
質問者

補足

DLLの作成経験ありません。 VC++も初めてです。 C作成のDLLがおかしい可能性は十分ありますね… #include "stdlib.h" extern "C" int gGetA(char * date) { 略 } です。 VB側では、宣言部に Declare Function gGetA Lib "TEST.dll" _ (ByVal strDate As String) As Integer 呼び出す場所では、 gGetA("20020501") と書いています。

  • zerosix
  • ベストアンサー率31% (47/149)
回答No.1

DLLの格納場所がVBから見えないんではないですか? 同じディレクトリにおいたり、c:\WINDOWS\SYSTEMに置いたりして 確認してみてください。

wan-chan
質問者

補足

DLLは見えています。 DLLは見つかりましたが、DLL関数がDLL内で見つかりません。 というエラーです。 情報が不十分で申しわけなかったです…

関連するQ&A

  • VC++6.0からVBで作成したActiveX.DLL内の関数が呼出しできない

    VB6.0で作成したActiveX.DLLをVC++6.0(Win32SDK)側で 呼び出すプログラムを作成中です。 VB側(DLL)では問題なく作成できています。 Classに1つPublic関数を作成しただけです。 (Instancingは5MultiUseにしてあります) しかし、VC++側の呼出しでDLL内の関数が 呼び出せないのです。 LoadLibraryExでDLL自体のハンドルは取得できるのですが GetProcAddressで関数の取得時にNULLが返ってきてしまいます。 今まで試したことは ・VBからの呼出しはOK ・MFCだとOK ・SDKでもuser32.dll呼出しのサンプルは関数も実行できる です。 今からMFCへ以降するのは厳しいのでSDkでの方法を 知りたいです。 VB側が悪いのかもしれませんが、関数1つですし、 いじるところもほとんどないので多分VC++側だと 思っています。 なにか注意点とか確認するところをおしえていただければ 幸いです。 環境 Windows2000 SP3 VB6.0 SP5 VC++6.0 SP5 Win32SDK

  • VB6からVC6で作成したDLLの関数を呼び出すときに注意すること

    VB6からVC6で作成したDLLの関数を呼び出すときに、型について気をつけないといけませんが、VB6でint型のものはVC6ではshortにしないといけないのでしょうか?マシンやOSや開発環境(例えばVS2005やGCC)により違ってくるのでしょうか? VB6とVC6でやり取りする場合の型について知りたいです。 あと、ActiveXのDLLの場合は関数にアクセスするのではなく、COM(という概念がわかっていないのですが)を使うのですか?

  • VisualStudio2010 DLL作成方法

    VisualStudio2010を使っています(初心者)。 VBで作成していたのですが、一部VC++を使わなければいけなくなりました。VC++はDLLで作成して、VBの方でDLLを参照して処理を行いたいと考えています。 そこで試しに作成したVC++で作成したDLLをVBで参照しようとしたらERRORになってしまい上手にできませんでした。※ERRORの内容までは詳しく覚えてません。VC++のDLLを作成~VBのDLLの参照までを説明しているサイトなどありましたら教えて下さい。 よろしくお願いします。

  • VCで作成したDLLの使用

    VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000

  • VB6で作成したDLLをVC6で使用する方法

    VB6で作成したDLLをVC6で使用できなくて困っています。 以下にトライしたことを示します。 (1) VB6でTRUEを返すだけの関数を入れたActiveX DLLを作成 (2) VC6のLoadLibraryに成功(戻り値がNULL以外) (3) VC6のGetProcAddressに失敗(戻り値がNULL) (4) VC.NET付属のDumpbinユーティリティでは(1)で作成した関数が表示されない。 何が悪いのでしょうか。 宜しくお願いします。

  • 16ビットDLLから32ビットDLLをコールする方法

    現在VC++で「16ビットDLLから32ビットDLLをコール」をしようと思って 調べていましたが、このご質問に頼るしか方法がなく、困っています。 状況  VB4.0(16bit)・・・16bit版でEXEを作成  VC++1.51・・・・・16bitDLLを作成  VC++4.0/6.0・・・・32bitDLLを作成  VB4.0(16bit)のEXEから、16bit版のDLLをコールし処理を行いたいの  ですが、16bit版DLLで扱えないVC++の関数(プロセス関数:spawn??())  を利用しなければならず、16bit版DLLの機能を32bit版DLLで作成し、  16bit版DLLから32bit版DLLを呼び出そうと思っております。 誰か助けて! 是非、皆様のお知恵を拝借致したく思います。

  • VC++6.0からVB.NETで作成した関数を呼ぶことができますか?

    VB.NET(Visual Basic 2005 Express Edition)でクラスライブラリ(AAA.dll)を作成し、BBBというModuleにCCCというFunctionをひとつ作成しました。 そのFunctionをVC++6.0で作成したプログラムから呼び出すことは可能でしょうか?また、可能な場合はどのような手順で呼び出すことができるのでしょうか? ■VB6.0でDLLを作成した場合 DLLのファイル名とFunction名さえ指定すればVC++6.0よりLoadLibrary、GetProcAddress関数を使用して呼び出せる。 ■VB.NETでDLLを作成した場合 DLLのファイル名+Module名+Function名という構成になってしまい、従来のLoadLibrary、GetProcAddress関数ではModule名が指定できないように思われるのですが・・・どうなんでしょう。 ご存知の方いらっしゃいましたらご教授お願いいたしますm(_ _)m

  • 関数から関数を呼ぶ

    VC++でDLLを作成しています。 超初心者です。 関数から関数を呼ぼうとしたら、 >関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。 というエラーがでました。 どういうことでしょうか?

  • Visual Basic6.0で作ったデータをVisual C 6.0を用いて通信したい(DLLファイルを作成)

    Visual C 6.0 Visual Basic 6.0 WindowsXP 掲題の件ですが、 VBで作成したデータをVCで通信したいと思い、 値を受け渡すにはDLLファイルを作って関数の戻り値にすれば良いと調べて分かり、 作成方法を知りたく質問させていただきました。 まず、 ・どちらのプログラムでDLLファイルを作成したらいいか ・どのようにコードを記述して作成したら良いか(VB,VC) VCで一度作成しようと思い、サンプルコードを調べ、ビルドしたところ 「デバック・・・実行可能ファイル・・・」 と表示されファイルを選ばなければいけない画面になりました。 これはどれを選択すれば良いのでしょうか。 よろしくお願い致します。

  • DLLへのアクセス

    同じDLLに対して、VBとVCでアクセスしている場合に 想定外のエラーが出たことはありますか? 2個のプログラムから同じDLLにアクセスする場合は、DLL名を別名にした方がいいのでしょうか?

専門家に質問してみよう