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と関連する良く見られている質問

Q「古い圧縮ファイル」の確認方法

Dドライブのディスクのクリーンアップをしたいのですが、実行できるものが、「古い圧縮ファイル」の削除しかありません。

「古い圧縮ファイル」がどのプログラムかを確認する方法を教えてください。

また、圧縮されたファイルの名前は青くなるらしいのですが、見つかりません。どうしてでしょうか
圧縮ファイルは1G弱あります。

Aベストアンサー

http://www.atmarkit.co.jp/fwin2k/win2ktips/106cleanup/106cleanup.html

初期設定では、50日以上アクセスの無かったファイルに対して、圧縮が行われます。
当然、圧縮してからでないと、ファイル名は青色にはなりませんので、ディスク・クリーンアップでの候補段階では、黒色のままです。


尚、設定によっては青色表示にならない場合も有りますけど。

http://121ware.com/qasearch/1007/app/nec.jsp?005084

QVB6.0で作成したデータ(配列に入った数値)をVC++に渡したい

掲題の件ですが、
VB6.0ではアドレスを指定して、
メモリを書いたり読んだりすることが困難ということが分かり、
VBで計算した結果をVC++に渡して、VC++でアドレスを指定してメモリに書き込んだり、
読み込んだりするようにしようと考えています。

プログラミングは初心者なので、これが実現可能かどうかが分からないのですが、
調べると、VC++でDLLファイルを作ってVBで参照するという方法はあったのですが。

・これは実現できるのか。
・どこにどのようなコードを書けば良いか(同プロジェクト内に違う言語を存在させることは可能か。)
・受け手側はどのように記述すれば値を受けれるか

以上よろしくお願いします。

http://forums.belution.com/ja/vb/000/007/59.shtml
このような問題がありました。

Aベストアンサー

>C言語でDLLを作成し、VBで呼び出すのでよろしいでしょうか?

yoshi004さんの立場だとそういうことになります。

>なにか環境に関する読みやすい本はご存知でしょうか?

さすがに私がDLL開発したのは10年くらい昔の話ですから
最近の本は分かりませんねえ。

ただ、昔と比べて書籍は不自由しないようになりましたから、
1フロアに専門書が置いてあるような大きな書店なら
目的の本はたいてい見つかると思います。

そういう場所で1~2時間くらいかけて目的の本を探すことも
これまた必要な経験です。

Qファイルの圧縮方法

AVIやMPGの画像ファイルを圧縮する方法を教えてください。900mb位のファイルをCD-Rに落とし込める700mbまで圧縮したいんですが。できれば、zipやlzhなどの後で解凍しなくてはいけないような圧縮方法ではなく、多少画像が荒くなってもファイルを単純に縮小させるような方法を教えていただけると有り難いのですが。。
因みに、TMPGEncを試してみたんですが、どうもうまくいかなくて。。ファイルサイズが元のファイルより逆に大きくなってしまうんです。
すいませんが、宜しくお願いします。

Aベストアンサー

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450 450 くらいでカット。
対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331
ではでは!

追伸
カンタンにならrmファイルに変更かなあ
でも画質は落ちますよ
ネット配信 ストリーミング形式でどぞ!
RealplusG2とかRealEncoderで変換
でもaviでもないしmpegでもないですけど、どお?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450...続きを読む

QVB6.0をインストールしている環境でVB.NetをインストールしてもVB6.0は動かせるでしょうか?

初心者的な質問ですみません。
VB6.0をインストールしている環境でVB.NetをインストールしてもVB6.0は動かせるでしょうか?
それともVB6.0をアンインストールしなければVB.Netはインストールできないのでしょうか。

Aベストアンサー

.NETとVB6は同一のパソコン内で分割(お互い干渉せずに)して使うことができます。.NETの説明書にも記載がありますよ。

私としてはVB6を使っていて.NETに変更するとだいぶ違った操作性になるためHDDに余裕があるのであればVB6は残しておいた方がいいと思いますよ。

Qファイルの圧縮方法が解りません

窓の杜やベクター等に置かれている、フリーの圧縮、解凍ソフトをダウンロードしていますが、テキストファイルや、画像ファイルの圧縮方法が解りません。何方か教えて頂けませんか?

Aベストアンサー

ソフトの開発者のサイトで質問することをお奨めします。

ソフトごとに操作方法が異なりますので、使用しているソフト名すらない状態では誰も必要とする回答を出せません。

窓の杜やベクターでは開発者のサイトへのリンクがありますから、そこからアクセスできますよ。

Q文字列を返すVCで作成したDLL関数をVBで呼ぶと...

VC++で文字列を返すDLL関数を作成しました。

LPCSTR GetVcString(void)

これをVBでStringとして受け取り、MsgBoxで表示すると正常に取得できているようなのですが、Lenで文字数を取得すると変な値が返ってきます。

1. Dim Ret As String
2. Ret=GetVcString()
3. MsgBox(Ret) ← VCで返された文字列は正常に表示されている
4. MsgBox(Str(Len(Ret))) ← 実際の文字数とはかけ離れた数値になる

2行目と3行目の間に、
Ret=Left(Ret,InStr(Ret,vbNullChar)-1)
を噛ませれば文字数は正常な値になるのですが、このような処理をしなくても正常に文字数を取得する方法があれば教えてください。

Aベストアンサー

こんにちは。maruru01です。

関数が返す文字列が、固定長で残りの部分がvbNullCharで埋まっているので、vbNullCharの手前までを抜き出す処理を入れなければいけません。
WinAPI関数などでは、このようなことはよく見られます。
単に文字数を出したいなら、

MsgBox(InStr(Ret, vbNullChar)-1)

でいいと思いますが。
でもその後でいろいろと処理するなら、

Ret=Left(Ret,InStr(Ret,vbNullChar)-1)

を入れた方がいいと思います。
たかが1行だし。

Qpsdファイルの圧縮方法

psdファイルの圧縮方法を教えてください。(基本的質問で恐縮ですが)
win98です。なお、ファイルは9MB程度ですが、圧縮したものを解凍する際、鮮明度が落ちずに元通りの画像で開けますでしょうか?

Aベストアンサー

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (デフォルトでは 1.2MB を上限として分割される。)
   (このサイズは +Lhaca で変更できる。)
 5. (4)のファイル全てを、容量を超えないようにメールに添付して送信
   する。
   (添付ファイル総数を本文に明記すること。)
 6. 受け取った側は、全ての添付ファイルを一箇所に集めて、バッチファ
   イルを実行する。
   (操作手順は、本文に明記すること。)
 7. 分割されたファイルが結合されるので、結合された圧縮ファイルを解
   凍する。
 8. 9MBのファイルが解凍されるので、作業する。


これでどうかな!?

※他の圧縮ソフトも分割機能が備わっていると思うが・・・

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (...続きを読む

QVB6.0のString関数に代わるVB2008のそれは?

2009年1月27日にVB 2008Expressをダウンロードしたばかりの初学者です。
ですから、色々とわからないことだらけです。
で、今回は VB6.0のString関数に代わるVB2008のそれ。

? String(12, "*")
************

Function Strings(ByVal C As Char, ByVal L As Integer) As String
  Return Space(L).Replace(" ", C)
End Function

少しは探しましたが、適当なのがなくてStrings関数を作成してしまいました。
2週間程度の初学者。
しかも、文字列関連のヘルプは昨日に初めて紐解いたばかり。
ですから、「適当なのがない」との判断はかなり怪しいものです。

そこで、「VB6.0のString関数に代わるVB2008のそれは、これですよ!」という回答をお願いします。

Aベストアンサー

'ああっ、思いっきり書き間違えてるorz

'5を外に出した
Dim s2 As String = new String(Char.ConvertFromUTF32(42),5)

'文字数を書くの忘れてる
Dim s3 As String = New String("ABC".toCharArray()(0),5)

QNTFS圧縮したファイルを全部まとめて戻す方法

NTFS圧縮したファイルをプロパティからひとつひとつチェックをはずして戻すのではなく、圧縮されたファイルを全部まとめて元に戻す方法ってあるのでしょうか?

Aベストアンサー

圧縮を解除したいファイルを全て選択した状態で
→プロパティ→NTFS圧縮のチェックを外す→OK

それらのファイルがフォルダに入っているなら
フォルダのプロパティからやってもいい。
(サブフォルダにも適用するか尋ねられるからOKにする)

QVB6.0で作成したプロジェクトのVB.NETへのアップグレードでエラー発生

卒業研究でVBを使う予定です。
先輩の研究を引き継ぐことになっているのですが、VB.NETでプロジェクトを開くことができなくて困っています。

先輩が開発したのはVB6.0で、今研究室のパソコンに入っているのはVB.NETです。
VB.NETのアップグレードウィザードを使えばVB6.0のプロジェクトをVB.NETで編集できることまで調べたのですが、いざアップグレードしようとしたときに以下のようなエラーが出てしまいます。
・エラー文---------------------------------------
アップグレードに失敗しました:例外が発生しました:参照されたコンポーネント
Slider
Slider
Slider
Slider
Slider
Slider
に、デザイン時のライセンスがありません。
--------------------------------------------------
アップグレードできるようにするにはどうすればいいでしょうか?
よろしくおねがいします。

Aベストアンサー

Sliderコントロールが認識されていないようなので
VB.NET で新規プロジェクトを作成し、コンポーネント参照で
Sliderコントロールを参照可能に設定する。
その後、VB6.0の既存フォームモジュールをプロジェクトへ追加する。
以上


人気Q&Aランキング

おすすめ情報