掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
スタティックライブラリとDLLの活用方法 (ID:53062)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> CRTの問題・・・全然意識もしていなかったですが、CRTのどういった問題なんですか? > ご指摘頂いた過去ログを見てみましたが、今の自分にはちょっと理解不能に近い > 領域でした(T_T; CRTには, ・シングルスレッド/リリース用(CRT本体はLIBとして提供) ・シングルスレッド/デバッグ用(CRT本体はLIBとして提供) ・マルチスレッド/リリース用(CRT本体はLIBとして提供) ・マルチスレッド/デバッグ用(CRT本体はLIBとして提供) ・マルチスレッド/リリース用(CRT本体はDLLとして提供) ・マルチスレッド/デバッグ用(CRT本体はDLLとして提供) の6種類があります。 利用するCRTは,モジュールに含まれる全てのオブジェクトファイルで全て一致させなければいけません。 そうでないと,LNK4098の警告が起きます。 全てのオブジェクトファイルには,ライブラリに含まれるオブジェクトファイルを含みますが, DLLを構成するオブジェクトファイルは含みません。 警告だけならよいのですが,場合によっては実行時にAccess Violationを引き起こしたりします。 #主に問題を起こすのはリリースとデバッグ。 DLLはEXEとは別にCRTがリンクされているので,DLLでmallocしたメモリをEXEでfreeしたり, その逆は基本的に出来ません。 #LIBでは問題なく行える。 それをするためのものが,最後の二つのDLLとして提供されているCRTです。 EXEとDLLで共通のCRT-DLLを利用している場合,DLLでmallocしたメモリをEXEでfreeしたりすることが可能になります。 > >・OSによって切り分ける場合 > >#OSによって,DLLそのものを入れ替えてしまう。 > "DLLはマルチプラットホームに対応している"と理解してよいのでしょうか。 そうではないです。 同じことをしたくても,NT系と95系で手段が異なる場合があります。 #例えば,プロセスの列挙。 その場合に, a) プログラム中に分岐を設ける OSの情報を取得して,それを元にifで分岐することで手段を変化させます。 b) EXEをごっそり入れ替える NT系用のEXEと95系用のEXEを別に用意しておいて,インストール時にどちらかをインストールします。 c) DLLをごっそり入れ替える インストール時にOSにあったDLLをインストールすることで,分岐を無くします。 の三通りの方法が考えられます。 bの方法は実行における効率が一番よいのですが, 非常に面倒であることはすぐにわかると思います。 で,aの方法が一般に行われますが,局所的にあるならともかく, 片っ端からif文が出てくるとデバッグが大変になります。 そこで,cの方法を採ることがあります。 cの方法は,aのif文をインストール時に決定してしまう方法です。 インストール時に, ・NT系OSにインストールした場合はfoo_nt.dllをfoo.dllに改称してインストール ・95系OSにインストールした場合はfoo_95.dllをfoo.dllに改称してインストール ということを行うことで,cを簡単に実現できます。 OSによる場合分けではないですが,EXE自体はI18N(InternationalizatioN:国際化)を行っておき, 言語や地域に依存する処理はDLLに行わせる(L10N/LocalizatioN:地域化)を行う, ということもできます。 #Windows NT系列のOSではこれが行われている……はず……。 例えば, ・EXE本体:各国共通 ・foo_en-GB.dll : 英語/イギリス用 ・foo_en-US.dll : 英語/アメリカ用 ・foo_ja-JP.dll : 日本語/日本用 のように,言語や地域によってdllを分割しておくと, 例えばfoo_en系では多バイト文字の対応は基本的にいらないですし, スペルの若干違うイギリス英語とアメリカ英語(colourとcolor等)にも対応できます。 当然,メニューなどは各国語用に地域化を行うことが出来ます。 #まぁ,文字列やメニューなどはリソースで処理できるのですが。 > >・関数名を名前で指定したい場合 > 名前で指定というのは、動的なDLLの場合に適用されるアレ(GetProcAddress??でしたっけ)ですか? そうです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.