プログレスダイアログの挿入時の問題

[戻る]
まるてぃんす 2005/01/24(月) 17:09:22
はじめまして。
まだVCを始めたばかりなので質問の内容がおかしいかもしれませんがお付き合い下さ
い。よろしくお願いします。

現在、VCでアプリケーションプログラムの作成(修正)をしているのですが、処理と
してはシリアル通信で基板から吸い上げたデータをウィンドウ上に展開するといったも
のです。このプログラムにおいて今回、追加機能としてシリアル受信(データ吸い上
げ)中にプログレスダイアログを用いて進行状況を表示させたいと思い、プログレスダ
イアログのコンポーネントを既存のワークスペースに挿入しました。ですが、肝心のシ
リアル受信処理を行っているソースに"progdlg.h"をインクルードしても下記のようなエ
ラーになってしまい定義することができません。

error C2504: 'CDialog' : 定義されていない基本クラスが宣言されています。
error C2061: 構文エラー : 識別子 'CWnd' がシンタックスエラーを起こしました。
error C2065: 'CG_IDD_PROGRESS' : 定義されていない識別子です。
error C2057: 定数式が必要です。
error C2146: 構文エラー : ';' が、識別子 'm_Progress' の前に必要です。
error C2501: 'CProgressCtrl' : 識別名を宣言するのに、型が指定されていません。
error C2501: 'm_Progress' : 識別名を宣言するのに、型が指定されていません。
error C2061: 構文エラー : 識別子 'CDataExchange' がシンタックスエラーを起こしました。
error C2143: 構文エラー : ';' が '}' の前に必要です。

他のソースでは問題なくインクルードできるものもあります。
根本的にどこが間違っているのか、どの辺りを見直したらいいのか分かる方がいました
ら教えて頂ければ幸いです。よろしくお願いします。

Takahashi 2005/01/24(月) 18:08:09
よくわからないんですけど、肝心のシリアル受信処理を行っているソースに
stdafx.h (CDialog は afxwin.h) とかインクルードされていないのでそうなると思います。
CG_IDD_PROGRESS は resource.h かな

背景がわからないので何ともいえませんが(推測です)
シリアル受信処理 のファイルを progdlg へインクルードするのが普通だと思います。
ダイアログでデータの吸い上げの関数を呼んで、プログレスバーを操作した方が簡単だ
と・・・
多分、受信状況を確認する何らかのインターフェースがあるはずなので
それでプログレスバーを操作すればいいと思います。
# メッセージ, イベント, 受信データ数確認の関数 とかかな

あと、MFC/SDK, スケルトンの種類(SDI, MDI, ダイアログ等), OS の種類, VC のバージョン
など書き込んだ方がいいですよ。

まるてぃんす 2005/01/24(月) 19:12:44
Takahashiさん返信ありがとうございました。

アドバイスを元にもう一度やってみます。

あと、今後書き込む際にはもう少し詳しくこちらの情報を掲示するようにしますね。

まるてぃんす 2005/01/25(火) 10:07:05
ご指摘どおり下記のヘッダーファイルをシリアル受信処理のソースにインクルードした
のですが、エラーが出てしまいました。
●追加インクルードファイル
#include "stdafx.h"
#include "afxwin.h"
●エラー内容
c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : 
fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not 
#include <windows.h>

resource.hについては問題なくインクルードできました。
ちなみにこちらの環境を補足しますと、ベースはMFCでOSはWindowsXP,VCのバージョン
は6.0になります。

アドバイスよろしくお願いします。

dairygoods 2005/01/25(火) 11:25:35
とりあえず、エラーメッセーの言う通りにしてみるべきでしょう。

ku 2005/01/25(火) 11:34:35
プロジェクトの作成手順から
1.「MFC AppWizard(exe)」−「MDI」で作成
2.「コンポーネントギャラリ」の「プログレスダイアログ」を選び挿入
3.ビルドしてもエラーはでない
4.cppのソースを追加してみる
  #include "stdafx.h"
  #include "resource.h"
  #include "ProgDlg.h"
  void abc(void)
  {
    CProgressDlg Dlg;
    Dlg.Create();
  }
5.ビルドしてもエラーはでない(CProgressDlgの使い方は知らないので問題あり)

#include "stdafx.h"は位置が大切なので、ソースの先頭に書く
afxwin.hの方は不要
現在のエラーは「プリコンパイル済みヘッダーを使用しない」を選んでいませんか?
そして"stdafx.h"より前に"windows.h"をインクルードしているとか?

原因が上記であるなら
状況にもよりますが、まずはいったん元プロジェクトに戻して作業をしなおすのがよいでしょう
元々あったプロジェクトで「プリコンパイル済みヘッダーを使用しない」を選んでいたら
それは必要な事かもしれないので、MFC関連は別ファイルに書くのがよいのかもしれない

まるてぃんす 2005/01/25(火) 12:02:42
dairygoodsさん、ありがとうございます。
エラーメッセージの言う通りにということですが、既にインクルードされている
<windows.h>の定義を解除してみればよいのでしょうか?試しに解除してみたところ、同
じエラーメッセージでした。

kuさん、ありがとうございます。
#include "stdafx.h"をソースの先頭に入れてみましたがダメでした。ちなみ
に"windows.h"よりも前に定義してやってみました。
また、「プリコンパイル済みヘッダーを使用しない」を選ぶ場所なのですが、どこにあ
るのか教えて頂ければと思います。

ど素人なもので大変恐縮なのですがよろしくお願いします。

ku 2005/01/25(火) 12:21:54
> #include "stdafx.h"をソースの先頭に入れてみましたがダメでした。
下の設定と対の可能性がありますので、こちらを試してください

1.プロジェクトの設定で、まず「設定の対象」をすべての構成を選ぶ
2.「+Source Files」の「+」をクリックして開く
3.目的とするファイル「〜.cpp」を選ぶ
4.「C/C++」タブを選ぶ
5.カテゴリ「プリコンパイル済みヘッダー」を選ぶ
6.プリコンパイル済みヘッダーファイル(.pch)を使用を選ぶ
です

元々「プリコンパイル済みヘッダーを使用しない」を選んでいた事に意味があるのなら
別の方法を考える必要がありますので、要注意です

まるてぃんす 2005/01/25(火) 12:51:59
kuさん、ありがとうございます。

上記のアドバイス通り設定してみましたが上手くいきませんでした。
手順2.のところなんですが、既存のものがSource Files下にもう一つディレクトリが
あり、その中に目的のソースがあるのですが、この構成に何か関係ありますでしょう
か?
後、手順6.で「プリコンパイル済みヘッダーファイル(.pch)を使用」を選んだときに
入力フォームに「stdafx.h」が出力されたのですが、特に問題はありませんか?

ちなみに手順5.で「プリコンパイル済みヘッダー」を選んだ時は「プリコンパイル済
みヘッダーを使用しない」が選択されていました。

以上です。よろしくお願いします。

なおき 2005/01/25(火) 14:07:33
CProgressCtrl は、

#include <afxcmn.h>

が、必要です。

ku 2005/01/25(火) 14:20:52
> 後、手順6.で「プリコンパイル済みヘッダーファイル(.pch)を使用」を選んだときに
> 入力フォームに「stdafx.h」が出力されたのですが、特に問題はありませんか?
問題ありません

よく考えたら先頭に
#include "stdafx.h"
と書いてあれば、うまくいくはずですね
オプションの設定は元に戻しておいてください

ファイルの先頭に
#include "stdafx.h"
と書いたときの、状態はどうなりますか?
(これを書いたときは#include <windows.h>も不要です)

まるてぃんす 2005/01/25(火) 14:50:21
kuさん、ありがとうございます。

ソースファイルの先頭に
#include "stdafx.h"
を追加し、#include <windows.h>をコメントアウトしてコンパイルしてみてるのです
が、相変わらず

c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : 
fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not 
#include <windows.h>
cl.exe の実行エラー

とアウトプットに表示されてしまいます。

ku 2005/01/25(火) 15:14:43
先ほどのエラーの1つ上の行には何と書いてありますか?
(エラー元のファイルです。たぶん拡張子はcppだと思います。)
ファイル名を書きたくなければStdAfx.cppかxxx.cpp(シリアル受信のファイル)かでも良いで
す

1.プロジェクト全体のバックアップを念のためとっておいて
2.メニューの「ファイル」−「新規作成」で「C++ソースファイル」で
  ファイルを追加してみてください
  ファイル名はa.cppで
3.中身
#include "stdafx.h"
#include "resource.h"
#include "progdlg.h"
CProgressDlg Dlg;
4.リビルドする

これでエラーがでますか?でるとしたらどんなエラーがでますか?

まるてぃんす 2005/01/25(火) 15:41:33
kuさん、ありがとうございます。
先ほどのエラーの一行上ですが、自分で作成したxxx.cpp(StdAfx.hをインクルードしよ
うとしているソースファイル)です。

あと、アドバイス通り新規にa.cppを追加し、内容を上記のように設定してコンパイルし
たところ問題なくできました。
既存のソースのインクルードで何か邪魔しているものがあるのでしょうか??ちなみに
現在ソースファイルに定義してあるインクルードは以下の通りです。

#include    "Forcelib.h"    // 自作ヘッダー
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "define.h"      // 自作ヘッダー
#include "proto.h"       // 自作ヘッダー
#include "struct.h"   // 自作ヘッダー
#include "Comunicate.h"  // 自作ヘッダー
#include "resource.h"

よろしくお願いします。

tetrapod 2005/01/25(火) 16:00:47
windows.h が入ってるぢゃん。

まるてぃんす 2005/01/25(火) 16:11:25
tetrapod さん、ありがとうございます。

上記に書いたのが現状のインクルードで、ここの一番上に
#include "stdafx.h"
を追加し、
#include <windows.h>
をコメントアウトしてやってみても上に書いたようなエラーが出てしまいます。

よろしくお願いします。

ku 2005/01/25(火) 16:18:10
#include "stdafx.h"
#include "resource.h"
#include "Forcelib.h"    // 自作ヘッダー
〜省略〜
//#include <windows.h>
〜省略〜
こんな感じになっていれば、ここ自体は問題ないでしょう

1.プロジェクトの設定で、まず「設定の対象」をすべての構成を選ぶ
2.「+Source Files」の「+」をクリックして開く
3.目的とするファイル「〜.cpp」を選ぶ
4.「C/C++」タブを選ぶ
「プリプロセッサの定義」の中に_WINDOWS_(_WINDOWSではない)がありませんか?
これが定義してあれば、これが悪さをしています
なければ、自作ヘッダーの中のどれかが
#define _WINDOWS_をしているのではないかな?

いずれの解決方法も_WINDOWS_を削除することですが、他に問題がおきるかもしれません
まるてぃんすさんが悪いわけではないのだろうが、
_WINDOWS_はユーザプロジェクトで定義しないほうがいいです
また_WINDOWSをミスって、_WINDOWS_となっただけかもしれません

まるてぃんす 2005/01/25(火) 16:43:47
kuさんありがとうございます。

上記の手順通り_WINDOWS_が設定されているか見てみましたが_WINDOWSのみでした。
また他のヘッダーで定義されているかどうか_WINDOWS_をファイルの検索で調べてみまし
たが特にどこにも定義されているところはありませんでした。

あと、このエラーが出るようになってからかどうかわからないのですが、いつの間にか
ワークスペース内のヘッダーソースファイルの中に"AFXV_W32.H"というのが追加されて
いるみたいなのですがこれは特に問題ないのでしょうか?

よろしくお願いします。

ku 2005/01/25(火) 17:21:19
失礼しました
> 1.プロジェクトの設定で、まず「設定の対象」をすべての構成を選ぶ
これをWin32 Debug、またはWin32 Releaseを選んでやってもらえませんか?
_WINDOWS_
を探してみてください

まるてぃんす 2005/01/25(火) 17:53:14
kuさん、ありがとうございます。

上記のように設定してWINDOWS_を探してみましたが、見つかりませんでした。

後、ちょうどこのソースの部分は、はじめC言語で作成していたモジュール部分をクラ
ス分けし、VCに展開したソースなのですがそういった点で何か問題が発生しているの
でしょうか?詳しく掲示できなくてすみません。

ku 2005/01/25(火) 18:44:03
> ワークスペース内のヘッダーソースファイルの中に"AFXV_W32.H"というのが追加されて
> いるみたいなのですがこれは特に問題ないのでしょうか?
このファイルを書き換えるような操作をしなければ問題ありません
見る必要もないということなら、ワークスペースのそのファイルを選択状態にして
削除キーで消すことができます(ファイル自体は削除されないので大丈夫)

> いつの間にか
メニューの「プロジェクト」−「プロジェクトへの追加」でファイルを選んで
AFXV_W32.Hを指定しないと、ワークスペースには入りません

> はじめC言語で作成していたモジュール部分をクラ
> ス分けし、VCに展開したソースなのですがそういった点で何か問題が発生しているの
> でしょうか?
これはソースを見ないとわかりません

エラーメッセージは#include <windows.h>をするなということですが実際には
#include <windows.h>で_WINDOWS_が定義されている
#include "StdAfx.h"をするとafxv_w32.hもインクルードするので
結果的にエラーメッセージが出力される
エラーの判定は#include <windows.h>があるかどうかではなく
_WINDOWS_が定義されているかどうかで判定している
ということです

ヒントになることは、a.cppでは問題なくて、該当.cppで問題となる
2つの違いの部分を中心に調べるのが良さそうだということです
ビルドの順番としては、該当.cppの
1.#include "StdAfx.h"
2.#include "Resource.h"
3.〜省略〜
と処理をするはずですが、2以降の処理より前で問題が起きていると考えられます

RAPT 2005/01/25(火) 20:26:26
どこかで、#pragma error なんたらとすると、当該行で、解釈を止める事ができます。
(=強制コンパイルエラーを引き起こす事ができます。)

#error Abort to compile.
 ↓
test.cpp(14) : fatal error C1189: #error :  Abort to compile.

これで、どこがトリガーになっているか絞り込むのに役立つかもしれません。

まるてぃんす 2005/01/26(水) 09:13:55
kuさん、RAPTさんありがとうございます。

こちらでもいろいろ調査してみましたが、やっとエラーの原因が発見できました。
内容的には
#include "Forcelib.h"
のインクルードが原因らしく、これをコメントアウトした結果、エラーは出なくなりま
した。ですが、このインクルードをコメントアウトした結果、他にどのような影響を及
ぼすのかまだ把握できていませんので、これから調査してみたいと思います。

また具体的にこのヘッダーファイルでは何をしているのか分かる方がいらっしゃいまし
たら教えて頂ければと思います。

tetrapod 2005/01/26(水) 09:17:25
自作ヘッダと既に書かれていますが、だとしたらあなた以外の誰にも内容はわかりません。
Forcelib.h の中で #include "windows.h" してるとか?

まるてぃんす 2005/01/26(水) 10:05:48
tetrapodさん、ありがとうございます。

そうですね、自作ヘッダーなんで自分しか分からないですよね。
勘違いしていました。すみません。

Forcelib.hのなかでwindows.hがインクルードされているか調べてみましたが、特に無さ
そうでした。

tetrapod 2005/01/26(水) 11:08:09
Forcelib.h の中で #include されている hoge.h が windows.h を呼んでいる
Forcelib.h の中で #include されている hoge.h の中で #include されている 以下略
まできっちり調べましたか?

個人的にはそー言うのやってられないので、コマンドラインから -E を使います。

MFC を使う場合 afxv_w32.h 以外が #include <windows.h> を呼んではいけません。
というエラーなので、皆様が既に指摘されているとおり、原因は2つしか考えられなくて
・直接または間接に #include <windows.h> しているファイルが有る
・誤ってか故意にか _WINDOWS_ というプリプロセッサシンボルを定義している
を、全ヘッダに関してチェックせよ、ということです。

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