プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (7件)

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)
{
}
-------------------------


あと、今回はいいですが、関数名の大文字小文字の区別にも気を付けてください。

この回答への補足

プロジェクト内にDefファイル?

ありません。
プロジェクト内には、

TESTクラス
  グローバル
   gGetA

しかありません。

>あと、今回はいいですが、関数名の大文字小文字の区別にも気を付けてくださ
い。

どういうふうにするのが普通なんですか?

補足日時:2002/03/15 16:15
    • good
    • 0

C++のプロジェクトに先ほど言ったように、拡張子を.defにしたテキストファイルを加えます。


または、a-kumaさまの言うとおり、__declspecを使っても構いません。
好きな方をお勧めします。

>>あと、今回はいいですが、関数名の大文字小文字の区別にも気を付けてください。
>どういうふうにするのが普通なんですか?
VBでは大文字と小文字の区別はありませんが、Declare Functionに指定する関数名だけは、大文字と区別を厳密に区別するので、C側で作った関数と大文字/小文字を統一しろと言うことです。
    • good
    • 0

サンプルを作ったのですが・・・


電話ラッシュで、その間にいろいろ回答が書かれてますね。。。
かぶるかもしれませんが、一応書いておきます。

それと#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);
    • good
    • 0
この回答へのお礼

サンプルまで作っていただき、
本当にありがとうございます!!

プロジェクトのClassViewしか見ていませんでした。
FileViewには、いろいろなファイルがありました。

今回は、defファイルを使わない方法でやってみます。
関数をエクスポートする必要があるんですね。
ほんと、初歩的なことも知らなくてごめんなさい。

お礼日時:2002/03/18 09:54

No.3 の回答にある通り、関数名(シンボル)がエクスポートされていないのが原因でしょう。



今時は def ファイルはなくてもエクスポートできます。

__declspec(dllexport) int __stdcall gGetA(char * date)
{
  なんとか
}

って感じかな。

この回答への補足

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

補足日時:2002/03/18 09:51
    • good
    • 0

そのまえに、C++プロジェクトで、Win32 Dynamic Link Libraryを選んでいますか?



普通DLLではstdlibなんてincludeしません。

この回答への補足

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

補足日時:2002/03/15 16:16
    • good
    • 0

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



>VC++で作成した関数をVB6.0で使おうとしたんですが

環境の問題でなければ、単にC作成のDLLがおかしいだけでは?
今までにDLLの作成経験があるのですか?
もしそうならば、流用したらできると思いますが・・・

最低でもインターフェイス部分だけでも公開しないと、なんとも言えません。

この回答への補足

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")
と書いています。

補足日時:2002/03/15 14:43
    • good
    • 0

DLLの格納場所がVBから見えないんではないですか?


同じディレクトリにおいたり、c:\WINDOWS\SYSTEMに置いたりして
確認してみてください。

この回答への補足

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

補足日時:2002/03/15 13:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています