atlbase.h と afxwin.hの同時定義

このQ&Aのポイント
  • VC++でMFCを用いてNT用のサービスプログラムを作成しています。atlbase.hがStdAfx.hに宣言されており、afxwin.hをincludeしたところエラーが発生しました。
  • atlbase.hとAfxWin.hが双方でwindows.hをincludeしているため、エラーが発生しています。
  • atlbase.hやAfxWin.hを改造することなく、別の方法でこの問題を回避する方法はありますか?
回答を見る
  • ベストアンサー

atlbase.h と afxwin.hの同時定義

こんにちは、honiyonです。  VC++で、MFCを用いてNT用のサービスプログラムを作成しています。  ATL COM AppWizardで、サービスアプリケーションを選択したので、atlbase.hが StdAfx.hに宣言されています。  CString型を使いたいので、該当cppファイルに、afxwin.hをincludeしました。 何故か StdAfx.hより先に afxwin.hをincludeすると、CStringの定義が正しくされないようなので、後にもってきています。 #include "StdAfx.h" #include <AfxWin.h">  この状態だと、atlbase.h, AfxWin.h双方で windows.hをincludeしているようで、AfxWin.hが参照する afxv_w32.hで、以下のようなエラーが発生します。 fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>  この問題を回避するために、atlbase.hやAfxWin.hを改造して回避出来そうですが、それは今後別のものを作る時の支障になりそうなので避けたいです。  その他の方法で回避する事は出来ないでしょうか?  宜しくお願いします(..

質問者が選んだベストアンサー

  • ベストアンサー
  • hinebot
  • ベストアンサー率37% (1123/2963)
回答No.1

「windows.h」を変更して良いなら、「windows.h」の先頭と最後に下記を追加してみてください。 (先頭) #ifndef _windows_h_include #define _windows_h_include (最後) #endif /* _windows_h_include */ これで二重includeは回避できます。(_windows_h_include の部分は一例です。分かりやすいラベルにしてください。)

honiyon
質問者

お礼

こんにちは、honiyonです。  ご回答ありがとうございます(^^)  極力、元からある(?)ヘッダ等に変更は加えたくないと思います。  まだ windows.hは覗いていなかったのですが、その宣言は無かったんですね(^^;  その変更は加えておいた方が今後とも便利そうです。  今回は、atlbase.h中の、#include <windows.h>を取り除いたファイルを別途用意し、 #include "atlbase_org.h"; のような感じで StdAfx.hの atlbase.hの宣言を置き換える事で対応してみました。  現在の所、問題なく動作しています。  ありがとうございました(..

関連するQ&A

  • [VC][ATL] 'ImageList_Read'が定義されていない!というエラーになるのは?

    VC++.NET 2002+WTL7.0で開発をしています。 アプリケーションウイザードでMFCアプリケーションを作成して、クラスの追加から「ATLのサポート」を追加します。そして、stdafx.hに #include "atlapp.h" #include "atlctrls.h" を記入すると 'ImageList_Read'が定義されていない というエラーになってしまいます。 とりあえずatlctrls.h内のエラー発生箇所をコメントアウトすることで対応しているのですが...どのようにしたらエラーがでないようにできるのでしょうか?よろしくお願いします。

  • サービスプログラムの作成方法

    VC++2008にてプログラムを作成しています。 現在、ダイアログベースで作成していたプログラムを、 サービスプログラムへ変更しようとしているのですが、 サービスプログラム自体を作成したことがなく、 いろいろネットで読んでみたのですが、 分からないところがありすぎて困っています。 ちなみに、現在のダイアログベースのプログラムは、 CAsyncSocketとマルチスレッドを使用して クライアントPCと相互通信をするものです。 PostgreSQLアクセス用のODBCプログラムもあります。 (ですので、当然ながらダイアログは必要ありません) まず、VisualStudioにて新規プロジェクト→ Windowsサービスを選択し、プロジェクトを作りました。 元のプログラムから、cpp/hファイルを移行し、 CString等の変数をしようしているため、 stdafx.hに、 #define _AFXDLL #include <afxwin.h> 上記を追記し、ビルドしました。 Setupプロジェクトも追加し、 カスタム動作のインストール、アンインストールに、 プライマリ出力を追加し、引数をそれぞれ、 /Service、/UnregServerにし、インストールしてみましたが、 管理ツールのサービスには登録されませんでした。 Serviceプログラムがいけないのかと思い、 単純に新規プロジェクトを作成し、 Setupプロジェクトを追加して、設定したあと、 インストールしてみましたが、これでも登録されていませんでした。 なにか、他に設定等が必要なものがありますでしょうか? Windowsサービスでの作成については、 ネットに載っているのを見つけられなかったのですが、 ATLでのサービスにも挑戦してみました。 しかし、<afxsock.h>をインクルードする手段が みつからず、断念しました。 どちらかの手段で、サービスプログラムを 作成したいのですが、上記問題について、 アドバイスでもよろしいので、よろしくお願いします。

  • VC++ExpressEdition2005でのMFC利用

    Visual Stdio Express Edition 2005 C++のMFCに関して質問させてください。 とあるプロジェクトをコンパイルしますと, "AFXWIN.H":No such file or directoryとのエラーが出ます。 調べて見たところ,AFXWIN.hはMFCだと言う記述を目にしました。 そして公式サイトの記述によりますと, >MFCとATLはVisual C++ 2005 Express Editionには含まれません。MFCとATLは、その他のすべてのVisual Studio2005エディションに含まれる予定です。 なのだそうです。 ですので,MFCを含むプログラムをこのソフトでやるのは無理かな? と思ったのですが,PSDKをインストールすればExpressEditionでも出来る, という事も聞きました。 結局真実がどうなのかがわからなくなってしまいました。 Visual C++ 2005 Express EditionではMFCは使えるのかどうか? またもしExpressEditionで使えないのならば,どれなら使えるのか?(Standard?Professional?) ご存知の方いらっしゃいましたらご鞭撻どうぞ宜しくお願いいたします。

  • stdafx.hについて

    http://homepage2.nifty.com/igat/igapyon/diary/2006/ig061108.html 上記URLにあるソースをBorlandC++コンパイラでコンパイルしたのですが、 「インクルードファイル 'stdafx.h' をオープンできない」というエラーが発生します。 どうしたらこのソースは動くのでしょう? stdafx.hとは何をしているヘッダーなのかも教えてもらえないでしょうか? よろしくお願いします。

  • CString: 識別子が見つかりません

    開発環境:Visual c++ 2008 Express Edion OS:Win XP Pro 次のエラーが表示されていて解決できません。 エラー内容は 1>d:\vc_source\dump\dump\Form1.h(448) : error C3861: 'CString': 識別子が見つかりませんでした です。 ちなみにinclude文は以下です。 #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <string> #include <cstring> やりたいことは String型からCString型を経由して、TCHAR型へ変換することです。またはその逆方法の変換です。そのためにCString型は必要になるのですが、そこでコンパイルエラーになっています。 知っているかがおりましたら、教えて下さい。

  • MFCのエラーについて

    「プリコンパイル済みヘッダーの検索中に予期せぬ EOF を検出しました」 というエラーが出ました。これを直すのにいろいろ試し結局 #include "stdafx.h"の表記をすることで直りました。 このstdafxヘッダーファイルはMFCを使用した時点で用意されるのですがこれを使うとなぜこのエラーがなくなるのかがわかりません。 どなたかおしえてください。よろしくお願いします

  • エラーの原因は?「この関数の定義が見つかりません」

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> ヘッダー void Transmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString); cppファイル void CMyDlg::Transmit(HANDLE hCom,OVERLAPPED old,unsigned char ucBuf[],DWORD dwByte,CString s) { } とコーディングしていて、ビルドも実行も全く問題ないのですが、 ClassViewでTransmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString) をダブルクリックして、関数に移ろうとすると 『この関数の定義(インプリメンテーション)が見つかりません』 というエラーが出ます。 <質問> このエラーは何が原因で出ているのでしょうか?? 宜しければご指摘の程お願い致します。

  • 文字列クラスをoperatorオーバーロードで実装したい

    ATLにCStringという文字列クラスがあり、それを参考に operatorによる演算子オーバーロードで同じようなものを開発していて 一つだけ分からないことがありました。 CStringだと関数に文字列を受け渡す時にこのようなことができます。 #include <windows.h> #include <tchar.h> #include <atlstr.h> void func( LPCTSTR String ) {   MessageBox( NULL, String, NULL, MB_OK ); } int main() {   CString cStr = _T("テスト");   func( cStr ); } 分からないのはfunc( cStr );の部分です。 このように関数に受け渡す時のオーバーロードはどのように書けば良いのでしょうか? 何かEffectiveC++の最初の方の簡単な例題にこれと同様なやり方が あった気がしますが手元に無いため確認が取れなくて困ってしまっています・・。

  • DLLでダイアログ

    VC++6.0にてMFCを使うDLLを作成しています。 関連HPを参考になんとかDLLを作ることが出来ました。 そこで今度はDLL側でダイアログボックスを作成して表示させようとしたところうまくいきません。 エラーも無くスルーされてしまいます。 こういう使い方は出来ないのでしょうか。 ↓DLL関数のソースファイルです。 ---------------------------------------------- #include "StdAfx.h" #include "Defs.h" #include "Func.h" #include "resource.h" #include "testdlg.h" #include "dlg2.h" int WINAPI DllFunc( CString &p_rcStr, CWnd *p_pcWnd ) { TestDlg dlg; Cdlg2 dlg2; dlg.ps = p_rcStr; dlg2.DoModal();//なにも出ない AfxMessageBox(p_rcStr);//コレはOK dlg.DoModal();//何もでない return TRUE; } --------------------------------------------

  • (msvcr71d.dll) でハンドルされていない例外が発生しました

    Visual C++ を勉強しだした Windowsプログラム初心者です。 ある参考書のサンプルで、メールスロットを利用したメッセッンジャー体験プログラムがあります。 このプログラム一つで、クライアントとサーバーを実感する為のもので、ダイアログボックスだけで出来ています。 デバック実行で、画像にある[送信]ボタンを押すと、 「Mailslot.exe の 0x1021471c (msvcr71d.dll) でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000015 を読み込み中にアクセス違反が発生しました。 。」 とエラーボックスが出ます。 原因は パソコンのOSのバージョンなのか、何か足りないライブラリなのか?切り分け所がわからなくて困っています。 どなたか良いアドバイスをお願いします。 OS : Vista Home Premium IDE: Visual C++.net スタンダード version 2003 因みに、stdafx.h の内容は↓です。 #pragma once #ifndef VC_EXTRALEAN #define VC_EXTRALEAN #endif #ifndef WINVER #define WINVER 0x0501 #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #ifndef _WIN32_WINDOWS #define _WIN32_WINDOWS 0x0410 #endif #ifndef _WIN32_IE #define _WIN32_IE 0x0400 #endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 一般的で無視しても安全な MFC の警告メッセージの一部の非表示を解除します。 #define _AFX_ALL_WARNINGS #include <afxwin.h> #include <afxext.h> #include <afxdisp.h> #include <afxdtctl.h> #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> #endif #include <Lmcons.h>

専門家に質問してみよう