• ベストアンサー

関数が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