DLL内でCStringを使う方法

[戻る]
マルボロマン 2004/09/17(金) 17:26:20
こんにちは。
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を使うことが出来るのでしょうか?

たく [E-Mail] 2004/09/17(金) 17:37:29
「MFC AppWizard(dll)」で新規プロジェクトを作成すればよいのではないでしょうか?

シャノン 2004/09/17(金) 17:45:52
windows.h をインクルードしなければいいと思いますが。
windows.h は MFC のヘッダが勝手にインクルードしてくれると思います。

シャノン 2004/09/17(金) 18:41:42
見当違いの書き込みでしたね。
MFC DLL の中で Windows.h をインクルードしてエラーが出ているのかと思っていまし
た。
非 MFC DLL で CString を使いたいって言うことなんですね。
でしたら、たくさんの書き込みで正解でしょう。

もうひとつの手段として、CString の代わりに std::string を使うというのはいかがで
しょうか。

マルボロマン 2004/09/17(金) 18:45:35
たく様、シャノン様、ご返答ありがとうございます。

>>たく様
新規で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' : 定義されていない識別子です。

マルボロマン 2004/09/19(日) 17:01:55
windows.hとAfx.hを同じファイル内で使用することはできないのでしょうか?

すみませんが、誰か誰かご存知の方、教えていただけないでしょうか?

シャノン 2004/09/19(日) 17:10:06
現在のケースは、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 を使いたいんだ!ということであれ
ば、俺から申し上げることはありません。

RAPT 2004/09/19(日) 22:46:26
・WTL::CStringを使う。
・自分でCStringクラスを実装する。

シャノン 2004/09/19(日) 23:36:59
#RAPT さんではなくマルボロマンさんへのレスです

> ・WTL::CStringを使う。
> ・自分でCStringクラスを実装する。

前者は盲点でした。
が、後者は勉強目的でなければ、はっきり言っておすすめできません。
WTL::CString なり std::string なり、優れたライブラリが既にあるのならば
それを使うべきだと思います。
ただ、文字列クラスを作ってみることはいい勉強になりますので、
勉強目的があるのならば、Effective C++ でも読みながらやってみるのも良いでしょ
う。

RAPT 2004/09/20(月) 22:17:06
# 参考になるかどうか…。

私がちょっとCStringクラスを自前で実装しかけた事があります。
# WTL::CStringクラスのソースを参考にして。

…死にかけました(o_ _)o パタ

ので、結局その時は、とりあえず必要な機能だけ実装して逃げました(;^-^A

あ、WTL::CComBSTR クラスも結構使えます。OLE処理する場合は、WTL::CStringクラス
よりも、WTL::CComBSTRクラスの方が便利な場合が多いです。

STLを使い倒すには、std::stringの方が便利ですが。

dairygoods 2004/09/21(火) 09:57:01
> windows.hとAfx.hを同じファイル内で使用することはできないのでしょうか?

Afx.h内でwindows.hは勝手にincludeされています。

マルボロマン 2004/09/27(月) 11:48:20
返事が遅れてしまい申し訳ありません。
シャノン様、RAPT様、dairygoods様、ありがとうございます。

今回何とかCStringを使わない方法で解決いたしました(汗)。
でも、皆様の意見大変参考になりました。

自分でCStringクラスを実装するというのも勉強がてらやってみようと思います。


ありがとうございました。

マルボロマン 2004/09/27(月) 11:49:13
[[解決]]
すみません、解決時のチェックを入れ忘れておりました。

古いスレッドには追加発言できません。