英語版のDLLで英語が表示されない

[戻る]
こおた 2008/07/07(月) 14:44:56
VC2003、WinXP home SP2を使用しています。

日本語と英語に対応するアプリケーションとDLLを作っています。
リソースファイルは日本語用と英語用のものを用意し
プログラムコード中の処理は、下記のようにして言語を切り替えています。

#if US
    // 英語の処理
#else
    // 日本語の処理
#endif

アプリケーションの方は、問題なく動作します。
DLLもdebugモードで作成された物では、正常に動作します。
しかし、Releaseモードで作成したDLLの場合、
"#if US"の処理とのころで日本語の処理をしてしまいます。
プロジェクトのプロパティでプロセッサの定義で"US"を
定義しています。

どなたか、分かる方いましたらご教授ください。
よろしくお願いします。

maru 2008/07/07(月) 15:36:58
USを定義しただけでは値が0扱いなので
#if US
    // 英語の処理
#else
    // 日本語の処理
#endif
はelseの方を通るでしょう。
#ifdef US
または
#if defined(US)
とするか、
US=1
を定義しましょう。

こおた 2008/07/07(月) 16:18:37
maruさま
ご返答ありがとうございます。
しかし、ご教授いただした3通りとも試しましたが
どれも正常に表示させることができません。

"US"のみを定義したときは、「#else」を通るということですが、
アプリケーションや、DLLでもデバッグモードの場合は
「#if US」を通ります。ここがちょっと謎です。

#DLLで私のような方法で日本語、英語を切り替える場合、
 プロジェクトのプロパティが初期状態であるならば
 プロセッサの定義に「US」を追加し「#ifdef US」
 または「#if defined(US)」で切り替えるように
 記述すればいいのでしょうか?
 他にも何か、設定を変更したりする必要があるのでしょうか?

#なお、DLLは既に作成されていたもので特に変更しなくても
 debugモードの場合は正常に表示できました。("US"が定義されていた。)
 releaseモードの場合、"US"が定義されていたが正常に表示できません
 でした。アプリケーションは、私が作成したもので
 debug、release両方とも"US"を定義することにより正常に表示
 できました。

引き続き申し訳ありませんが分かる方いましたらご教授お願いいたします。

maru 2008/07/07(月) 17:32:07
> "US"のみを定義したときは、「#else」を通るということですが、
> アプリケーションや、DLLでもデバッグモードの場合は
> 「#if US」を通ります。ここがちょっと謎です。
失礼しました。
コンパイルオプションでマクロ定義した場合、 シンボルはデフォルトで1になるとの事です。
(ヘルプに記載されていた。)
従って#if US節が通る事は正しい動作でした。

ということで、こおたさんの現象はよく分かりません。
# 実は、リリース側はどこかでUSが0に定義し直されていたりして...

subaru 2008/07/07(月) 17:59:57
DLLだけがダメならアプリケーションが参照しているDLLが、
プロセッサの定義を変更後にリビルドしたDLLではない
可能性はありませんかね?

こおた 2008/07/07(月) 18:28:24
maruさん、subaruさん、レスありがとうございます。

maruさん
> # 実は、リリース側はどこかでUSが0に定義し直されていたりして...

おそらくそういうことなんだと思います。
USを他のマクロ定義にしても表示できないので・・・


subaruさん
> DLLだけがダメならアプリケーションが参照しているDLLが、
> プロセッサの定義を変更後にリビルドしたDLLではない
> 可能性はありませんかね?

確認しましたがプロセッサの定義を変更後にリビルドしたDLLです。

tetrapod 2008/07/07(月) 19:44:50
Debug 版のプロパティだけ変更してあって
Release 版のプロパティは変更していない、だけとか?
それぞれ別々に設定できるわけで

こおた 2008/07/07(月) 20:13:57
tetrapod さん レスありがとうございます。
Debug、Release共に設定してあります。

いろいろと試して分かったこと。
・新規にDLLのプロジェクトを作成して、プロパティの設定をほぼ、
 同じにしても同様の現象はでない。
 →プロパティの設定には依存しない!?
・下記、英語の処理にエラーの発生するコードがある場合、
 Debugモードの場合のみ、コンパイル時にエラーが発生。
 (当たり前と言えば当たり前・・・)
#if US
    // 英語の処理
#else
    // 日本語の処理
#endif
 →DLL生成時に発生する問題ではない!?

その他、気になる点
・DLLはVC6.0のプロジェクトをVS2003のプロジェクトに変換したもの。
・DLL4つ、あるが全て同じ現象(全てVC6.0から変換したもの)
・libについては、問題がおきない。(VC6.0から変換したもの)


現象の再現性がないので、難しそうですが、何か
確認すべき点でもあればレスいただけると助かります。

よろしくお願いします。

こおた 2008/07/08(火) 09:58:41
[[解決]]
VC6.0で作成されたDLLはdebugモードの場合のみ
プロセッサに"US"が定義されていました。
ReleaseモードではVS2003に変換した後に"US"を定義しました。
変換前に定義した場合、うまく表示できるようになりました。

再現するかVC6.0で新規にプロジェクトを作成してVS2003に変換後
"US"を定義しましたが、正常に表示できました。
(設定や、変換方法に依存!?)

原因が分からずすっきりしないのですがこれで解決とさせていただきます。
レスくれた方、ありがとうございました。

ITO 2008/07/08(火) 12:04:47
VC6.0とVS2003はリソースその他の記述が違います。
プロジェクト変換しても違いは直らないと思います。
その食い違いはないですか?

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