Windows DLLとUNIX .soのソース共存

思いの外、上手い具合に作業が進んでいます。

Makefileは専用のを用意しないといけませんが、ソース自体は、殆ど書き換えなしで対応できそうです。

WindowsのDLLに必要で、UNIXの.soには不要な DllMain 関数みたいなものは、#ifdef ~ #endif で括ってUNIXでは見えないようにする必要がありますが、それ以外は関数部分の書き換えは殆ど必要なさそうです。

例えば、

EXPORT DWORD CALLBACK LibGetVersion(char *pchOut, const size_t len)


といったAPIがgTefにはあります。EXPORT と CALLBACK は

#ifdef _MSC_VER
#ifndef CALLBACK
#define CALLBACK __stdcall
#endif
#define EXPORT extern "C" __declspec(dllexport)
#else
#ifndef CALLBACK
#define CALLBACK
#endif
#define EXPORT extern "C"
#endif


のように定義しており、このような工夫により、関数部分は見た目変更無く、複数の環境に対応できました。

gTefでは、DLLにアクセスする部分は、DllHandleというclassになっており、ここを工夫することで、やはりDLL/.soを扱う部分も、関数内は変更ゼロで処理できました。

ソースは元々Windows用ですので、UNIXの場合は以下のようなtypedef を追加します。
typedef	void *			HMODULE;
typedef const char * LPCSTR;
typedef void * FARPROC;


これで、やはりソースの見た目は殆ど変更なく、両方の環境に対応できます。
実際に使うAPI関数は、#ifdef~#endifで分けて行ないます。

Windows  UNIX

LoadLibraryEx  dlopen
FreeLibrary  dlclose
GetProcAddress  dlsym

この辺を、メソッドとして実装することで、見た目も綺麗に、かつ扱いも利便良く行なうことができます。

2009/08/13(木)23:01 |Comments(0) |Trackback(0)

C++ | プログラミング | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

UNIX版gTefが動き始めました ホーム UNIX版gTef
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR