リソーススクリプトでの文字列の連結 – プログラミング – Home

リソーススクリプトでの文字列の連結
 
通知
すべてクリア

[解決済] リソーススクリプトでの文字列の連結


kr
 kr
(@kr)
ゲスト
結合: 21年前
投稿: 11
Topic starter  

今まで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のリソースコンパイラでは、複数の文字列を連結することはできないのでしょうか?


引用未解決
トピックタグ
kr
 kr
(@kr)
ゲスト
結合: 21年前
投稿: 11
Topic starter  

間違えたので訂正します。以下のようになっています。

> #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)


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

うーん、
Borland環境いうと、SDKですね。
VCでSDKのスケルトンを作成して、リソースファイルを
見比べると言うのはどうですか?
またはサンプルコードと見比べるとか.....
僕はいつもそうしています。


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

推測あり。

マクロは使えないな。
統合開発環境で値を設定する仕組みになっているから。
resource.hにマクロを定義するしそれ以外の子とされると困る。
統合開発環境を通さなければいいんじゃない。
そういう方法があったはず。
不便だけどな。


返信引用
kr
 kr
(@kr)
ゲスト
結合: 21年前
投稿: 11
Topic starter  

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を使用するようにして対応しました。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> 結局、カスタムビルド規則でリソースのコンパイルに
> brcc32を使用するようにして対応しました。
うーん、
解決したみたいだけど、動作は良好?
 ・見た目動くが印刷で例外が発生する。
 ・ファイルコモンダイアログは表示するがパラメータを設定すると例外が発生する。
僕が今ちっと考えただけでも2点可能性がありますね。
コンパイラーが変わるんだから、動作がおかしくなる可能性は大きいと思います。
 開発環境が書いてないので分かりませんが、VC 200x 以降になるとまた
微妙に変わります。
動作チェックは入念にしたほうがいいですね。


返信引用
kr
 kr
(@kr)
ゲスト
結合: 21年前
投稿: 11
Topic starter  

やっぱり問題あるのでしょうか…。
私が動作チェックした限りでは、印刷やファイルオープンダイアログで
テンプレートを使っている部分も問題なく動いているようです。

とはいえ、やはり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

ちょっと冗長ですが、これで本当に解決できました。


返信引用
kr
 kr
(@kr)
ゲスト
結合: 21年前
投稿: 11
Topic starter  

追記
よく考えたら、この場合別に複数行に分ける必要もないですね。

LTEXT MAKE_STR(MyProgram ver.VERSION_MAJOR.VERSION_MINOR\nCopyright(c) 2009 kr)

プリプロセッサシンボルが前後の文字とつながってしまう場合は
複数行に分けなければいけないですが。
難しく考え過ぎていたようです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました