OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 暇なときにでも
  • 質問No.235547
  • 閲覧数802
  • ありがとう数1
  • 気になる数0
  • 回答数7
  • コメント数0

お礼率 76% (1582/2056)

VC++で作成した関数をVB6.0で使おうとしたんですが、
タイトルのようなエラーになってしまいます。
関数名はあっています。
なにか考えられることはありますか?
通報する
  • 回答数7
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル12

ベストアンサー率 40% (230/562)

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

お礼率 76% (1582/2056)

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

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

TESTクラス
  グローバル
   gGetA

しかありません。

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

どういうふうにするのが普通なんですか?
投稿日時 - 2002-03-15 16:15:07
-PR-
-PR-

その他の回答 (全6件)

  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

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

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

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

最低でもインターフェイス部分だけでも公開しないと、なんとも言えません。
補足コメント
wan-chan

お礼率 76% (1582/2056)

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:25


  • 回答No.1
レベル10

ベストアンサー率 31% (47/149)

DLLの格納場所がVBから見えないんではないですか? 同じディレクトリにおいたり、c:\WINDOWS\SYSTEMに置いたりして 確認してみてください。 ...続きを読む
DLLの格納場所がVBから見えないんではないですか?
同じディレクトリにおいたり、c:\WINDOWS\SYSTEMに置いたりして
確認してみてください。
補足コメント
wan-chan

お礼率 76% (1582/2056)

DLLは見えています。
DLLは見つかりましたが、DLL関数がDLL内で見つかりません。
というエラーです。
情報が不十分で申しわけなかったです…
投稿日時 - 2002-03-15 13:34:40
  • 回答No.4
レベル12

ベストアンサー率 40% (230/562)

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

普通DLLではstdlibなんてincludeしません。
補足コメント
wan-chan

お礼率 76% (1582/2056)

もちろん、それは選んでいます。
でも、stdlibをincludeしないとatoi関数がつかえなかったので。
投稿日時 - 2002-03-15 16:16:34
  • 回答No.5
レベル14

ベストアンサー率 50% (1122/2211)

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

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

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

って感じかな。
補足コメント
wan-chan

お礼率 76% (1582/2056)

そのとおりに書いてみました。
結果は同じです・・・。
投稿日時 - 2002-03-18 09:51:17
  • 回答No.6
レベル12

ベストアンサー率 65% (276/422)

サンプルを作ったのですが・・・ 電話ラッシュで、その間にいろいろ回答が書かれてますね。。。 かぶるかもしれませんが、一応書いておきます。 それと#5a-kumaさんの発言 >今時は def ファイルはなくてもエクスポートできます。 知りませんでした。 このサンプルは思いっきりdefを使ってます。 Cの構成 Testファイル ├Source File │├gGetA.cpp ...続きを読む
サンプルを作ったのですが・・・
電話ラッシュで、その間にいろいろ回答が書かれてますね。。。
かぶるかもしれませんが、一応書いておきます。

それと#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

お礼率 76% (1582/2056)

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

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

今回は、defファイルを使わない方法でやってみます。
関数をエクスポートする必要があるんですね。
ほんと、初歩的なことも知らなくてごめんなさい。
投稿日時 - 2002-03-18 09:54:26
  • 回答No.7
レベル12

ベストアンサー率 40% (230/562)

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

>>あと、今回はいいですが、関数名の大文字小文字の区別にも気を付けてください。
>どういうふうにするのが普通なんですか?
VBでは大文字と小文字の区別はありませんが、Declare Functionに指定する関数名だけは、大文字と区別を厳密に区別するので、C側で作った関数と大文字/小文字を統一しろと言うことです。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ