VC++でDLLを作成しています。
超初心者です。

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

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まず、LoadLibrary("000.DLL");を行いDLLをロードします。


その後GetProcAddress("GetEndDate");でGetEndDate()のアドレスを求めないと、GetEndDate()では呼び出せません。
まずは、基本から。

呼び出し側のAddDateA()は__declspec(dllexport)は不要です。

この回答への補足

うーん。
ごめんなさい。
意味がわかりません。

defファイルで、
関数名を列記するだけではダメなのでしょうか?

今度は、「GetEndDateAは定義されていない識別子、というエラーが出てしまいました。

また、VBからこの関数も使うのですが、
それでも、__declspec(dellexport)は不要ですか?
そもそも、これはなんのため・・・。

かなり初歩的なことで申し訳ないです…

補足日時:2002/03/25 10:20
    • good
    • 0

エラーの内容を書くよりどのようなプログラムでひっかかっているのかを書いた方が分かりやすいかと思います。


考えられるものとしては、関数の引数の型は合っていますか?
また、返り値の型は合っていますか?
プロトタイプ宣言と比較してみてください。
*型やアドレスわたしなど間違えやすいと思うのでチェックしてみてください。
もちろんデリミタ-や{}は大丈夫ですよね。
もしどうしても分からないようならプログラムを省略して書いてみてはいかがでしょうか。

この回答への補足

アドバイスありがとうございます。

呼び出し側

extern "C" __declspec(dllexport) char __stdcall AddDateA(char * date,int dd)
{
int i_end;
i_end = GetEndDate(date);
}

呼ばれる関数
extern "C" __declspec(dllexport) int __stdcall GetEndDateA(char * date)
{

}

です。

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

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

このQ&Aと関連する良く見られている質問

QVC++6で作成したDLLをVC++.NET2003から呼び出せますか

現在、VC++.NET2003で作成しています。あるメーカから提供されているDLLがあるのですが、そのDLLとのリンクまではできたのですが、実行するとエラーになってしまいます。
(プログラムが異常終了するのではないのですが、そのDLLからの戻り値がエラーになり、期待した結果が得られません。)
そのDLLはVC++6で作成したものらしく、マニュアルには、VC++6で作成したアプリケーションからの呼び出し方法が、記述されていました。
VC++6でアプリを作成すれば、正常に呼び出せることは明白なのですが、いかんせん、VC++.NET2003での開発が、ある程度進んでしまっていますので、いまからVC++6に切り替えるわけにもいきません。
それで、一般論として、確認したいのですが、VC++6で作成したDLLをVC++.NET2003で使用することは、出来ないのでしょうか。(これから、メーカにも確認する予定ですが、まずは、こちらで確認したく、投稿した次第です)

Aベストアンサー

> もし、原理的にVC++6のDLLをVC++.NETでも呼び出し可能なら、

呼び出すだけなら原理的には可能ですが、作り方次第では正しく動作しないと思います。
典型的なまずい例は、DLL側でmallocやnewなどで割付けたオブジェクトを呼び出し側で解放させる、またはその逆です。

結局のところ、DLLの作り方に強く依存しますので、想像だけではこれ以上分かりません。

QC++の関数をfortranから呼びたい。(g++, vc2005)

C++の関数をfortranから呼びたい。(g++, vc2005)

いつも大変お世話になっています。

以前、下記の質問させて頂いたのですが、
再度問題が発生したので改めて質問させて頂きます。
http://oshiete.goo.ne.jp/qa/5806443.html

WindowsXPで
MinGWを入れて、fortranコンパイラはg77を
VC++2005を入れて、c++コンパイラはclで
実行しようとしています。

以下の内容が実行結果なのですが、
リンクのときにwarningが出ますが、これは何なのでしょうか?
宜しければ、ご教授お願いします。
※ソースは前回の質問に載せてあります。

D:\C>g77 -c helloFortran.f

D:\C>cl /c /EHsc funcHelloC.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

funcHelloC.cpp

D:\C>g77 helloFortran.o funcHelloC.obj
Warning: .drectve `/DEFAULTLIB:"libcpmt" /DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unr
ecognized

D:\C>

C++の関数をfortranから呼びたい。(g++, vc2005)

いつも大変お世話になっています。

以前、下記の質問させて頂いたのですが、
再度問題が発生したので改めて質問させて頂きます。
http://oshiete.goo.ne.jp/qa/5806443.html

WindowsXPで
MinGWを入れて、fortranコンパイラはg77を
VC++2005を入れて、c++コンパイラはclで
実行しようとしています。

以下の内容が実行結果なのですが、
リンクのときにwarningが出ますが、これは何なのでしょうか?
宜しければ、ご教授お願いします。
※ソースは前回の質問に載せ...続きを読む

Aベストアンサー

http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/6_2.html
リンカに渡すオプション引数なのですが、書式がMS系のものになっていて、g77では理解できないので、無視する、という警告です。


# 前回のでちゃんとコンパイルができたのに、わざわざVC++を使う理由はなんでしょう?

QVC++2005 VC++6.0で使えた関数がつかえない?(たとえば、GetModuleFileNameとか、、)

VC++超超初心者です。

いままであったVC++6.0で利用できていた、VC++2005で
GetModuleFileNameができなくなりました。
(利用できないことなんて、ないと思いますが、、、)

何か宣言とかinclude文とか必要なのでしょうか。

すみませんが、よろしくお願いします。

Aベストアンサー

VC++2005無料版にはPlatformSDKが別になっているのでそのままでは使えません
別にPlatformSDKをインストールしてVC++2005の設定を変える必要があります
VC++2008では無料版にもSDKが付属しています

QC++BuilderやDelphiでVC++用のDLLの作成

C++Builderの画面から新規作成からDLLウィザードを選ぶと、VC++スタイルのDLLを選択して作成できるようになっています。VC++用のDLLを作成出来るとは書かれていません。実際、VC++コンパイラからリンクを拒否されます。

また、VC++用のインポートライブラリをCOFF形式からBorland用のOMF形式に変換するユーティリティCOFF2OMF)は存在していますが、OMF形式をCOFF形式に変換する手法を見かけません。

変換方法を書いているWEBや雑誌記事とかを紹介してください。

Aベストアンサー

C++BuilderのDLLウィザードでの「VC++スタイル」はヘルプにあるようにエントリポイントが DLLMain になるだけです。
DLLはC++Builderで作成してもVisualC++で作成しても、どちらからも利用することができます。
MFC拡張など利用する側に対応が必要なDLLは別ですが。

C++BuilderとVisualC++ではインポートライブラリに互換性がありません。
C++Builder の場合は付属のツール implib.exe でDLLからインポートライブラリを生成できますが、VisualC++では簡単な方法はありません。

VisualC++での正攻法は LIB.EXE を使ってインポートライブラリを作成することですが、DEFファイルを書いてやらないといけません。
http://bme.t.u-tokyo.ac.jp/members/manabu/MKL_BCC/mkl_BCC.html
のdllからふるいCOFF形式のlibを作成するのところ。
http://www.sun-inet.or.jp/~yaneurao/dlang/Chapter-05.html#050800000000
がもう少し分かりやすいかもしれません。

私の場合は LoadLibrary(), GetProcAddress() で動的に呼び出すか、同じ定義の関数をエクスポートするダミーのDLLを作ってインポートライブラリを得ます。

参考URL:http://www.sun-inet.or.jp/~yaneurao/dlang/Chapter-05.html#050800000000

C++BuilderのDLLウィザードでの「VC++スタイル」はヘルプにあるようにエントリポイントが DLLMain になるだけです。
DLLはC++Builderで作成してもVisualC++で作成しても、どちらからも利用することができます。
MFC拡張など利用する側に対応が必要なDLLは別ですが。

C++BuilderとVisualC++ではインポートライブラリに互換性がありません。
C++Builder の場合は付属のツール implib.exe でDLLからインポートライブラリを生成できますが、VisualC++では簡単な方法はありません。

VisualC++での正攻法は LIB...続きを読む

Qvc++6.0 と vc++2500

vc++6.0で

ifstream ifs("userkey.dat");
ifs.getline(oc_user1, 63);

となっていてコンパイルできていたのですが

2005にしたら
コンパイルできません
どうしたらコンパイルできますか

6.0と2005の違いを知るには何を読んだらいいでしょうか?

Aベストアンサー

std::ifstream ifs("userkey.dat");
ifs.getline(oc_user1, 63);

としてみてはいかがでしょうか。


人気Q&Aランキング

おすすめ情報