Discussion:
DLLについて質問
(too old to reply)
unknown
2008-04-14 09:24:02 UTC
Permalink
DLLについて質問です。

従来MSDOSでRS232CのCソースファイルをコンパイルして、例えばseial.objとし本体objにlinkしてhontai.exeで使っていました。
今このRS232CソースをWindows95用とWindowsNT用に若干手直しした
CソースファイルをDLLファイルにしたいのですが、
エラー(h.ファイルで)となってしまいました。
serial.h
#if defined(_INC_CONIO) || defined(CONIO)
#define EXPORT extern
#else
#define EXPORT extern "C" __declspec (dllexport)
#endif
#define STDCALL __stdcall

// EXPORT int STDCALL serOpen(int port, int conf); エラーとなったのでやむなく
下記にint serOpen(int port, int conf);
以下続く

どこが悪いのでしょうか。
手順は下記の通りです。
1.Visual C++6.0を起動
2.Win32 Dynamic-Link Libraryを選択、プロジェクト名serial
3.空のDLLを選択
4.serialディレクトリー内に上記serial.hとserial.cをコピー
5.プロジェクトに追加
6.ビルドを選択実行
の順です。

どうもEXPORTで引っかかっているような気がします。
DLLて面倒ですね。こんなことでエラーになるくらいなら、
最初からobjファイルとしてビルドして一体化たい気もするのですが、
いかがでしょうか。


/******************************
堺市南区原山台
上田 恭平
E_Mail ***@sannet.ne.jp
******************************/
 
ちゅ
2008-04-14 10:25:20 UTC
Permalink
$B$A$e(B $B$G$9!#(B

On Mon, 14 Apr 2008 02:24:02 -0700
DLL$B$K$D$$$F<ALd(B
$B=>Mh(BMSDOS$B$G(BRS232C$B$N#C%=!<%9%U%!%$%k$r%3%s%Q%$%k$7$F(B
$BAGKQ$J5?Ld$G$9!#(B
MS-DOS$B$G%7%j%"%k%]!<%H$K%"%/%;%9$9$k$K$O!"(BBIOS$B8F$S=P$7$+(B
$B:#$3$N(BRS232C$B%=!<%9$r(BWindows95$BMQ$H(BWindowsNT$BMQ$K<c43<jD>$7$7$?(B
$B$A$c$s$H(BWin API $B$G=q$-D>$7$F$$$^$9$h$M!#(B

$B%(%i!<$NFbMF$,J,$+$i$J$$$N$G?dB,$G$9!#(B
extern "C" $B$O(B $B#C!\!\$N5!G=$G$9!#(B
--
$B$A$e(B
unknown
2008-04-17 06:27:00 UTC
Permalink
ご示唆ありがとうございます。
ちゅさんの示唆当たっていました。
ちゃんとWin API で書き直していますよね。
ソースを見直しましたが、Win APIで書かれています。
extern "C" は C++の機能です。
当たりでした。どうもVisualC++6.0で内部から空DLLを作成した
上で該当のserial.hとserial.cをプロジェクト追加した上で
ビルドした訳ですが、ヘッダファイル上(当然serial.c上部で#includeされています)
でC2059エラー構文エラーを起こしていました。
このソース自体は10年位前にソースごと購入してそれ以来使用してきたもの
ですから、古いものなので問い合わせる訳にも行かず困っていたところです。
戻りますが、内部からコンパイルすると”C"が二重表現に当たるようです。
この部分を取り除くと無事DLLファイルは作成されました。
ありがとうございました。

/*********************
堺市南区原山台
上田 恭平
E_Mail ***@sannet.ne.jp
**********************/
UETA, Shin-ichi
2008-04-16 01:15:20 UTC
Permalink
こんにちは、植田です。
Post by unknown
serial.h
#if defined(_INC_CONIO) || defined(CONIO)
#define EXPORT extern
#else
#define EXPORT extern "C" __declspec (dllexport)
#endif
まず、__declspec (dllexport)でエクスポートしたシンボルは
__declspec (dllimport)でインポートする必要があります。
このような宣言の違いをマクロで隠蔽しようというのがこの
イディオムの趣旨です。

また、extern "C" でエクスポートしておきながら、インポート時
には "C" リンケージが明示されていないのも矛盾します。
Cしか想定していないのであればそれでもいいのでしょうけど、
DLL化するのであればCとC++の違いに対処すべきかと。

ヘッダファイルでよく見かける

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

―― という呪文の意図はそういうところにあります。
Post by unknown
手順は下記の通りです。

Post by unknown
4.serialディレクトリー内に上記serial.hとserial.cをコピー


ちゅさんのご指摘にもあるとおり、extern "C" はC++固有の表現
なので、Cでコンパイルすると構文エラーになります。
serial.c のファイル名を serial.cpp に変更するか、プロジェクト
オプションに /TP を追加してみてください。
Post by unknown
どうもEXPORTで引っかかっているような気がします。
DLLて面倒ですね。こんなことでエラーになるくらいなら、
最初からobjファイルとしてビルドして一体化たい気もするのですが、
いかがでしょうか。
そもそもなぜDLL化するのでしょうか?
静的リンクで済むのであればそちらの方が遥かに安全です。
動的リンクにする以上、その「お約束」に従うことが求められる
ので、面倒くさくなるのは必定です。
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
unknown
2008-04-17 06:35:00 UTC
Permalink
少し経緯をお話すべきでした。反省しています。
10年位前に購入したMSDOS用のRS232CのCソースファイル
を組み込んで(objファイルとして)通信ソフトを作成していました。
その中にWindows用(95とNT用)に修正済みのソースファイルがあり、
nmakeで作成するようにとの指示でしたが、
VisualC++6.0に空DLL作成がありましたので内部で
当然ビルドできるだろうと踏んだ訳です。
古いソースですので、問い合わせる訳にもいかず、試行錯誤を繰り返して
考えあぐねて質問した訳です。
 今回、DLL化を考えたのは今後に備えて経験した方が良いと考えたからです。
Post by UETA, Shin-ichi
ちゅさんのご指摘にもあるとおり、extern "C" はC++固有の表現
なので、Cでコンパイルすると構文エラーになります。
serial.c のファイル名を serial.cpp に変更するか、プロジェクト
オプションに /TP を追加してみてください。
 さて、先のちぇさんの示唆は当たっていました。
結論から言いますと、
ヘッダフィルserial.hの
#define EXPORT extern "C" __declspec (dllexport)から
"C"を取り除いた
#define EXPORT extern __declspec (dllexport) 
で無事DLLファイルは作成できました。

このソースファイルの拡張子は.cで.cppではありませんからVisualC++6.0は
C言語であるとしてビルドします。
元々Cとして取り扱われる訳ですから表現は二重となり構文エラーを
起こしていた訳です。
serial.h上でc2059エラー
  ただ、少し古い本ですが、「プログラミングWindows95」Charies Petzold著と言う古典的入門書にサンプルソースとして
serial.hに
#define EXPORT extern "C" __declspec (dllexport)が載っていました。
初心者としては迷いますよね。
本当にありがとうございました。

/**********************
堺市南区原山台
上田 恭平
Mail ***@sannet.ne.jp
**********************/

Continue reading on narkive:
Loading...