こんにちは。
OS;Windows XP HomeEdition、開発環境VC++6.0を使っています。
今回、DLL内でCStringを使おうとしているのですが、使えずに困っております。
---DLLのヘッダー部---------
#include stdafx.h
#include Input.h
#include <stdio.h>
#include <windowsx.h>
---------------------------
上記の#include部のいたる所に「Afx.h」を入れて試してみましたが、
fatal error C1189: #error : WINDOWS.H already included. MFC apps must not
#include <windows.h>
というようなエラーが出てしまいました。調べてみた所、上記のエラーはwindows.hの重
複定義エラーとうことでしたが、どうしたらよいかわからず困っております。
Afx.hをインクルードせずにCStringを使おうとしても、「定義されていない」というこ
とでエラーになりました。
どうすればDLL内でCStringを使うことが出来るのでしょうか?
「MFC AppWizard(dll)」で新規プロジェクトを作成すればよいのではないでしょうか?
windows.h をインクルードしなければいいと思いますが。
windows.h は MFC のヘッダが勝手にインクルードしてくれると思います。
見当違いの書き込みでしたね。
MFC DLL の中で Windows.h をインクルードしてエラーが出ているのかと思っていまし
た。
非 MFC DLL で CString を使いたいって言うことなんですね。
でしたら、たくさんの書き込みで正解でしょう。
もうひとつの手段として、CString の代わりに std::string を使うというのはいかがで
しょうか。
たく様、シャノン様、ご返答ありがとうございます。
>>たく様
新規でAfx.hを作るということでしょうか?
>>シャノン様
何度かwindows.hをインクルードしない(消す)事を試しましたが、他のコード部で使っ
ているのか、下記の
case WM_MOUSEMOVE:
if (Action)
Action->MouseMove(this, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
というコード部の
Action->MouseMove(this, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
で以下のエラーが発生します。
error C2065: 'GET_X_LPARAM' : 定義されていない識別子です。
error C2065: 'GET_Y_LPARAM' : 定義されていない識別子です。
windows.hとAfx.hを同じファイル内で使用することはできないのでしょうか?
すみませんが、誰か誰かご存知の方、教えていただけないでしょうか?
現在のケースは、MFC を使わない(プロジェクト作成時に Win32 Dynamic Link
Library を選んだ)DLL で、CString を使いたいということでよろしいですか?
VC++ 6.0 の CString は MFC とともに使うように設計されていますので、非 MFC DLL
から使うことはあまりおすすめできません(VC++ 7.0 以降ならば、CString は非 MFC
からも使えるように設計されています)。
以下のことを検討されてはいかがでしょうか
・MFC DLL にする
・CString ではなく std::string を使う
どちらもダメだ、断固として非 MFC で CString を使いたいんだ!ということであれ
ば、俺から申し上げることはありません。
・WTL::CStringを使う。
・自分でCStringクラスを実装する。
#RAPT さんではなくマルボロマンさんへのレスです
> ・WTL::CStringを使う。
> ・自分でCStringクラスを実装する。
前者は盲点でした。
が、後者は勉強目的でなければ、はっきり言っておすすめできません。
WTL::CString なり std::string なり、優れたライブラリが既にあるのならば
それを使うべきだと思います。
ただ、文字列クラスを作ってみることはいい勉強になりますので、
勉強目的があるのならば、Effective C++ でも読みながらやってみるのも良いでしょ
う。
# 参考になるかどうか…。
私がちょっとCStringクラスを自前で実装しかけた事があります。
# WTL::CStringクラスのソースを参考にして。
…死にかけました(o_ _)o パタ
ので、結局その時は、とりあえず必要な機能だけ実装して逃げました(;^-^A
あ、WTL::CComBSTR クラスも結構使えます。OLE処理する場合は、WTL::CStringクラス
よりも、WTL::CComBSTRクラスの方が便利な場合が多いです。
STLを使い倒すには、std::stringの方が便利ですが。
> windows.hとAfx.hを同じファイル内で使用することはできないのでしょうか?
Afx.h内でwindows.hは勝手にincludeされています。
返事が遅れてしまい申し訳ありません。
シャノン様、RAPT様、dairygoods様、ありがとうございます。
今回何とかCStringを使わない方法で解決いたしました(汗)。
でも、皆様の意見大変参考になりました。
自分でCStringクラスを実装するというのも勉強がてらやってみようと思います。
ありがとうございました。
すみません、解決時のチェックを入れ忘れておりました。