ATLメモ [C++]
ATLを使ってコンテキストメニューに追加しているのだが、コンパイルが通らなかった・・・
ATLプロジェクトは通常のWin32やMFCのプロジェクトと比較して以下の点が違う
・DLLMainはVCでプロジェクトを作るときに「自動的に」作成される。
・VC6,2003,2005で、自動的に作成されるソースが違う。そのため、VC6なプロジェクトをVC8でコンパイルしようとするとコンパイルエラーが発生する。
・PlatformSDKのバージョン違い?によって、ヘッダファイルが「自動的に」更新される。
・Win32などのプロジェクトでは、DebugとReleaseしかプロジェクトが無いが、ATLプロジェクトでは、Releaseの変わりに、Release MinSize,Release MinDependencyの2つがあり、さらにMBCSとUNICODEのバージョンがある(よって3*2=6プロジェクトある)
・マルチバイトなプロジェクトでCRT関数を使うと、LIBCMT.LIBが_mainが無いと怒られる。これは、マルチスレッドCRT関数は、main内で初期化を必要とするためである。ちなみにunicodeな場合、内部でmemcmpなどの関数に置き換えられるので、コンパイルが通る。
「ATL ライブラリ リファレンス CRT スタートアップ コードに依存する関数の確認」参照
・http://support.microsoft.com/kb/99456/ja
MinDependencyでコンパイルするための関数比較表
この表によれば、strcmpの変わりにlstrcmpを使うことで対応できるが、CRT関数をサポートしている数が異常に少ない。特にstrncmpに対応する関数がない。
・VisualStudioにDDKのパスが入っている場合、コンパイルが通らない。
intsafe.hが見つからない > inc\crtにパスを通せばOK
atlalloc.hのLLONG_MINが見つからない > inc\atl30 にパスを通せばOK
TCHARが再定義 > 未解決
・VisualStudioとATLのバージョンの関係
VC6 ATL3.0
VC2003 ATL7.0
VC2005 ATL7.1
2003からバージョンをコンパイラのバージョンに揃えたようだ。
・DDKとATL
DDKのフォルダにはATLがついている。
XP,2003 SP1 DDK ATL21,ATL30
WDK ATL21,ATL30,ATL71(crtの下にある)
・それらを使ってコンパイルしてみる
2003SP1DDKのATL30 : TCHARの再定義だのなんだのと怒られる
WDKのATL71 : atlcore.hでnLengthが無いと文句を言われる
結論、ATLを使う可能性がある場合、DDKのパスをVSに登録してはいけない。
DDKなプロジェクトばかり作る場合、めんどくさいんでDDKのパスをVSに登録しちゃうんですが、そうすると、結構変なエラーが出たりする。SCSI_PASS_THROUGHのようなユーザーレベルアプリケーションを作成しようとすると、DDKのパスは通しておきたい。PlatformSDKが前に定義されてると再定義だのなんだのと言われた記憶があるので、DDKのパスを優先的にしておく。CRTをインクルードすると、PlatformSDKなどで再定義エラーが出るので、それはいれない。必要な場合のみプロジェクト側でインクルードするようにする。通常のアプリケーションはこれで問題なかった。が、ATLで問題が出てきてしまった・・・正しいパスの設定方法ってあるのか?
結局プロジェクトごとにDDKのパスを設定するのが正しい気もするが、なんだかなーって感じ
コメント 0