今までBorland環境で作成していたプログラムをVCに移植しているのですが、
リソーススクリプト内で複数の文字列を連結している部分がエラーになってしまいます。
例えば以下のような部分です(折り返されていますが、実際は一行です)。
LTEXT MyProgram ver. VERSION_TEXT ( VERSION_CHARSET_TEXT )\nCopyright(c)
2009 kr,-1,32,8,120,16
ここで使われているシンボルは別ファイルのヘッダ内に、
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define VERSION_TEXT ver. #VERSION_MAJOR . #VERSION_MINOR
#ifdef UNICODE
#define VERSION_CHARSET_TEXT Unicode
#else
#define VERSION_CHARSET_TEXT Ansi
#endif
のように定義しており、このヘッダはプログラム中でも利用しています。
バージョンを直し忘れたりしないようにこうしているのですが、
リソースのコンパイル時にエラーになってしまいます。
また、STRINGTABLE内で長い文字列を読みやすくするために
以下のように分割しているのですが、
IDS_SOUND_FILE_FILTER, サウンドファイル\0*.mid;*.midi;*.rmi;*.mp3;*.wav\0
MIDIファイル(*.mid;*.midi;*.rmi)\0*.mid;*.midi;*.rmi\0
MP3ファイル(*.mp3)\0*.mp3\0
WAVEファイル(*.wav)\0*.wav\0
すべてのファイル(*.*)\0*.*\0
これも同様にエラーになります。
Borlandのリソースコンパイラ(brcc32)では問題なくコンパイルできます。
MSのリソースコンパイラでは、複数の文字列を連結することはできないのでしょうか?
間違えたので訂正します。以下のようになっています。
> #define VERSION_MAJOR 1
> #define VERSION_MINOR 0
> #define VERSION_TEXT ver. #VERSION_MAJOR . #VERSION_MINOR
#define MAKE_STR_(x) #x
#define MAKE_STR(x) MAKE_STR_(x)
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define VERSION_TEXT ver. MAKE_STR(VERSION_MAJOR) . MAKE_STR(VERSION_MINOR)
うーん、
Borland環境いうと、SDKですね。
VCでSDKのスケルトンを作成して、リソースファイルを
見比べると言うのはどうですか?
またはサンプルコードと見比べるとか.....
僕はいつもそうしています。
推測あり。
マクロは使えないな。
統合開発環境で値を設定する仕組みになっているから。
resource.hにマクロを定義するしそれ以外の子とされると困る。
統合開発環境を通さなければいいんじゃない。
そういう方法があったはず。
不便だけどな。
ITO さん、wclrp ( 'o') さん、お返事ありがとうございます。
いくつか試してみたのですが、例えばマクロを使わずに以下のように単純に
文字列を複数に分けて書いてもエラーになるので、MSのリソースコンパイラでは
隣接する文字列を連結することはできないのでしょうね。
(文字列の間に + とか \ とか入れてみても駄目でした)
LTEXT Version 1,-1,0,0,40,8
以下のように書いた場合は正常にコンパイルされるので、
マクロを使用すること自体は問題ないようです。
LTEXT MAKE_STR(VERSION_MAJOR),-1,0,0,64,8
また、以下のようにすれば一応文字列が連結できました。
#define CAT_STR(str1,str2) str1##str2
TEXT MAKE_STR(CAT_STR(Version,1)),-1,0,0,64,8
ただ、これだとマクロ定義されたものは連結できないので無意味ですが。
(もっとプリプロセッサを駆使すればどうにかなるのでしょうか?)
結局、カスタムビルド規則でリソースのコンパイルに
brcc32を使用するようにして対応しました。
> 結局、カスタムビルド規則でリソースのコンパイルに
> brcc32を使用するようにして対応しました。
うーん、
解決したみたいだけど、動作は良好?
・見た目動くが印刷で例外が発生する。
・ファイルコモンダイアログは表示するがパラメータを設定すると例外が発生する。
僕が今ちっと考えただけでも2点可能性がありますね。
コンパイラーが変わるんだから、動作がおかしくなる可能性は大きいと思います。
開発環境が書いてないので分かりませんが、VC 200x 以降になるとまた
微妙に変わります。
動作チェックは入念にしたほうがいいですね。
やっぱり問題あるのでしょうか…。
私が動作チェックした限りでは、印刷やファイルオープンダイアログで
テンプレートを使っている部分も問題なく動いているようです。
とはいえ、やはりbrcc32をいつまでも使い続けるのもどうかと思い、
改めてリソースコンパイラのヘルプを見てみたところ、STRINGTABLEの説明で、
以下のように最後に \ を付ければ途中で改行できるとの記述がありました。
IDS_SOUND_FILE_FILTER, サウンドファイル\0*.mid;*.midi;*.rmi;*.mp3;*.wav\0\
MIDIファイル(*.mid;*.midi;*.rmi)\0*.mid;*.midi;*.rmi\0\
MP3ファイル(*.mp3)\0*.mp3\0\
WAVEファイル(*.wav)\0*.wav\0\
すべてのファイル(*.*)\0*.*\0
STRINGTABLEだけかと思ったのですが、LTEXTでもこの技が使えたので
色々試行錯誤した結果、以下のようにして文字列の連結が行えました。
LTEXT MAKE_STR(MyProgram ver.\
VERSION_MAJOR\
.\
VERSION_MINOR\
\r\nCopyright(c) 2009 kr),-1,32,8,120,16
ちょっと冗長ですが、これで本当に解決できました。
追記
よく考えたら、この場合別に複数行に分ける必要もないですね。
LTEXT MAKE_STR(MyProgram ver.VERSION_MAJOR.VERSION_MINOR\nCopyright(c) 2009 kr)
プリプロセッサシンボルが前後の文字とつながってしまう場合は
複数行に分けなければいけないですが。
難しく考え過ぎていたようです。