PCH(プリコンパイル済みヘッダー)について

[戻る]
こんこん 2006/05/04(木) 18:52:51
いつも勉強させて頂いております。

質問なのですが、
VS2005、MFCにてDLLを作成したのですが、
警告warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含
んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してくださ
い。
と表示されます。どのようにしたら警告を消せるのでしょうか?
コンパイルは通って*.lib、*.dllは作成されています。

また、このDLLを今度はマネージプロジェクト(VC++ .NET)で
リンクすると、
fatal error C1189: #error :  "PCH に対してこのファイルをインクルードする前
に 'stdafx.h' をインクルードしてください"
と言うエラーが出ます。

解決できなくて困っています。ご助言よろしくお願いします。

επιστημη 2006/05/04(木) 20:20:22
どちらもwarning/error messageに従えばいい。

こんこん 2006/05/04(木) 23:20:20
επιστημηさん、ありがとうございます。

>どちらもwarning/error messageに従えばいい。
との事なのですが、どのように行えば良いのか
分からないのです。

Unicode形式での保存とはどのように行えば良いのか
わかりません。
プロジェクトのプロパティやツールのオプション等を
調べたのですがよく分かりません。

また、エラーC1189ですが、stdafx.hはインクルードしているのですが、
何故かこのエラーが取れません。MFCで作ったDLLのリンクを
外すとこのエラーは出ません。何処にstdafx.hをインクルード
すれば良いのですか?ちなみに、MFC側のDLLには既に*.cppファイルに
元からインクルードされていますし、.NET側の*.cppファイルにも
最初からstdafx.hが既にインクルードされています。

えーと 2006/05/05(金) 10:02:07
「このファイルをインクルードする前
に 'stdafx.h' をインクルードしてください」
このエラーが出てるファイルのインクルードより前に持ってけばいいんじゃ
ないの?

こんこん 2006/05/05(金) 11:59:54
えーとさん、レスありがとうございます。

>このエラーが出てるファイルのインクルードより前に持ってけばいいんじゃ
ないの?

これは既に試しました。いろんな場所(*.h、*.cppファイル)に手動で
追記したのですが現象は変わりませんでした。
このエラーが起きる箇所はMFC側DLLのヘッダーにある

#ifndef __AFXWIN_H__
    #error "PCH に対してこのファイルをインクルードする前に 'stdafx.h' をイ
ンクルードしてください"
#endif

という元からウィザードが勝手に作った一文で引っかかっているのですが、
ここをコメントアウトするとエラーは無くなります。
この「__AFXWIN_H__」というのが良く分からないのですが、
.NET側ではMFCを使っていないので引っかかるのでしょうか?

よろしくお願いします。

K'S 2006/05/05(金) 12:17:05
stdafx.h は各ソースの必ず'一番最初に'includeされていますか?


###余談です
Windowsアプリと他のターゲット用のアプリで、ソースを共有してて、

#ifdef _WINDOWS
#include "stdafx.h"
#else
#ほにゃらら
#endif

ってしたかったのに、同じようなエラーが出て出来ませんでした。
不便--;

ITO 2006/05/06(土) 09:53:50
もとのソースはなんですか、VC6.0じゃないですか。
もし、VC6.0だとするとその類のエラーが出るかもしれません。

こんこん 2006/05/06(土) 14:49:27
K'Sさん、ITOさんありがとうございます。

>stdafx.h は各ソースの必ず'一番最初に'includeされていますか?
はい。全ての*.h、*.cppにstdafx.hを入れてみたのですが
現象は変わりませんでした。何故引っかかるのでしょう?

>もとのソースはなんですか、VC6.0じゃないですか。
>もし、VC6.0だとするとその類のエラーが出るかもしれません。
その通りです。元のソースはVC++6.0で、そのコードをVC2005のMFCで
再コンパイルしてVC2005の.NETでリンクしてます。
はじめからVC2005のMFCで作らないといけないのですか?

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

ITO 2006/05/06(土) 15:20:27
>はじめからVC2005のMFCで作らないといけないのですか?
スケルトンをVC2005で作成してVC6.0で追加した部分をコピーして方法も
あると思います。
VC6.0とVC2003は両方インストールできたので、VC2005も同じように
出来ると思いますが.......
手元にVC2005がないので試していません。
VC6.0のソースはVC6.0でコンパイルするのが一番の近道です。

PATIO 2006/05/08(月) 10:16:03
多分、マネージドだからではないですか?
アンマネージドでは大丈夫だと思います。
少なくとも私の環境ではうまく行っています。
VC6.0は元々マネージドを考慮に入れていない
(当時はマネージドなんてありませんしてたし)
からだと思いますけれど。

PATIO 2006/05/08(月) 10:17:19
あうあう。誤字

誤)
(当時はマネージドなんてありませんしてたし)

正)
(当時はマネージドなんてありませんでしたし)

こんこん 2006/05/08(月) 21:05:15
ITOさん、PATIOさん、レスありがとうございます。
いろいろと自分なりに試行錯誤してまして返事が遅れました。

根本的な原因は未だ掴めてはいないのですが、
VC2005のMFCでのDLLをVC2005の.NETへリンクするのをやめ、
直接*.hと*.cppを.NETのプロジェクトにほおりこんでみました。
すると予想してたとおり、訳の分からないエラーが盛りだくさん
出てきました。当然と言えば当然なのですがマネージコードに
アンマネージ(MFC)コードを単純に入れてもダメというのは分かっていましたが、
ネット上でいろいろググっていると、アンマネージコードとの混在は
/clr:pureオプションではダメっぽい事を書いてあるサイトがあり、
試しに/clrオプションに変えてみてコンパイルしたところ、あれだけ
たくさん出たエラーが見事にエラー0でコンパイルが通りました。
これにはちょっとびっくりしましたが、実行すると実行時エラーで
落ちる"オチ"かなと思いつつ実行すると問題なく動いています。

/clr:pureを/clrに変えると何か問題とかありますか?
今のところこれで問題なく意図した動きをしてくれているので
問題ないのであればこのままこれで開発したいと考えています。

ご教授よろしくお願いします。

むしろ 2006/05/09(火) 23:08:01
>/clr:pureを/clrに変えると何か問題とかありますか?
アンマネージドコードで/clr:pure指定するほうが問題だろう

こんこん 2006/05/10(水) 22:04:41
[[解決]]
むしろさん
>アンマネージドコードで/clr:pure指定するほうが問題だろう
いえ、もともとマネージコードです。マネージコードに
MFCで作った*.hと*.cppをマネージプロジェクトに追加し、
そのマネージプロジェクトの/clr:pureを/clrにしたのです。

とりあえず動いているのでこれで解決とします。
皆さんどうもありがとうございました。

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