ページ 1 / 1
windowsとstlの文字列操作
Posted: 2007年3月09日(金) 22:28
by 組木紙織
現在windowsのTextOut()で、stringで用意した文字列をどうにかして使えないかと。試行錯誤しています。
例えば、
string str = "sample sample";
TCHAR ch[30];
/*
ここで色々な操作をする
*/
TextOut(hdc, 10,10, ch, lstrlen);//画面上にsample sampleと表示される。
というような操作をしたいです。
条件としてはcスタイルのキャストは使えないものとします。
OSはwindowsXPを使用しています。
コンパイラは
Microsoft Visual Studio 2005
インストールされている Edition: VC Express
となります。
解決策を知っている方がおられたら、コメントをお願いします。
Re:windowsとstlの文字列操作
Posted: 2007年3月09日(金) 23:34
by Justy
stringクラスが、std::stringのことだったとして、
CStringにクラスに変換して、それをそのまま APIに突っ込むってのはどうでしょう。
[color=#d0d0ff" face="monospace] const std::string str = "sample sample";
const CString cstr(str.c_str());
TextOut(hdc, 10,10, cstr, cstr.GetLength());[/color]
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 08:42
by 組木紙織
以下のようにすると次のようなエラーが出ました。
///////////
エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\tet\project\win1\s2\p1.cpp 23
////////////
#include<windows.h>
#include<string>
//ソースの一部
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
const std::string str = "sample sample";
const CString cstr(str.c_str());
TextOut(hdc, 10,10, cstr, cstr.GetLength());
EndPaint(hWnd , &ps);
return 0;
CStringはMFCとかATLのクラスのようなので新しくヘッダーファイルを
インクルードしないといけないのかなとおもってmsdnのリファレンスで調べてみたのだが良くわかりませんでした。
まだまだ始めたばかりなので、良くわからないことばかりで大変です。
msdnのリファレンスも読みにくいし分かりにくいし。
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 08:55
by box
> エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\tet\project\win1\s2\p1.cpp 23
p1.cppの23行目は、どういう内容ですか?
投稿されたソースの一部に含まれていますか?
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 09:15
by 組木紙織
すみません。ちょうどそのところを出していたのですが。
上のソースの
>const CString cstr(str.c_str());
の部分に当たります。
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 14:14
by Justy
CStringが定義された atlstr.hヘッダはインクルードされていますか?
されていなければしてみて下さい。
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 14:42
by 組木紙織
インクルードできないようです。
ファイルが見つからないとのエラーが出ます。
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 15:36
by Justy
ひょっとして PlatformSDKが入っていないんでしょうか。
http://www.microsoft.com/japan/msdn/vst ... usingpsdk/
入っていなければ入れてみて下さい。
# std::stringを使わないで
typedef std::basic_string<TCHAR> tstring;
を定義した上で、tstringクラスをを使うってのではだめですかね。
これなら
[color=#d0d0ff" face="monospace] const tstring tc(_TEXT("sample"));
TextOut(hdc, 10, 10, tc.c_str(), tc.size());[/color]
で済みます。
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 16:15
by 組木紙織
win32アプリケーションを作るために入れたはずなんですが、インクルードできないということは
設定が完了していないということですよね。
パスをちょっと調べてみます。
で、出来なかったら再インストールで入れなおしてみます。
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 16:52
by 組木紙織
flatformSDKの設定は以前にしてありました。パスも確認してみましたが、間違ってはいなかったです。
atlstr.hのファイルが存在するかどうか検索をかけたところ、何処にも存在しないようです。
Re:windowsとstlの文字列操作
Posted: 2007年3月10日(土) 17:16
by Justy
うちのバージョンなら "atlstr.h"があるのですが、
"atlmisc.h"かもしれません。
もし "atlmisc.h"あったら、それをインクルードしてみて下さい。
Re:windowsとstlの文字列操作
Posted: 2007年3月11日(日) 17:08
by 組木紙織
platformSDKをcompleteで再インストールしてみましたが、状況に何も変化がありません。
ヘッダーファイルも検索をかけて入っているか確認してみたのですが、どちらも存在しませんでした。
あきらめたほうがいいのかな。
Re:windowsとstlの文字列操作
Posted: 2007年3月11日(日) 19:25
by Justy
では afx.hはどうでしょう。
Re:windowsとstlの文字列操作
Posted: 2007年3月11日(日) 20:16
by 組木紙織
afx.hのヘッダーはありましたが、なんだか変なエラーが出ます。
/*file afx.h******/
#include <afxver_.h> // Target version control
/****************/
エラー 1 fatal error C1083: include ファイルを開けません。'afxver_.h': No such file or directory c:\program files\microsoft platform sdk\include\mfc\afx.h 27
Re:windowsとstlの文字列操作
Posted: 2007年3月11日(日) 21:56
by Justy
afxver_.hがコンパイラから見えていないようです。
まずそのファイルがあるかどうかを探して、
見つかったらそのディレクトリにパスが通っているか確認してみて下さい。
Re:windowsとstlの文字列操作
Posted: 2007年3月11日(日) 22:20
by 組木紙織
#inclde <>は再帰的な検索をしていないようなので、platformSDK\includeの下部のフォルダにpathを通してコンパイルしたところ、またエラーがでてきました。
エラー 1 fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h> c:\program files\microsoft platform sdk\include\mfc\afxv_w32.h 14
/**file afxv_w32.h ************/
/*line 13*/#ifdef _WINDOWS_
/*line 14*/ #error WINDOWS.H already included. MFC apps must not #include <windows.h>
/*line 15*/#endif
/****************************/
次に#include<windows.h>をはずしてコンパイルかけたところ
エラー 1 fatal error LNK1104: ファイル 'uafxcwd.lib' を開くことができません。 revers
のエラーがでました。
uafxcwd.libを検索すると
C:\Program Files\Microsoft Platform SDK\Lib\AMD64\atlmfc
C:\Program Files\Microsoft Platform SDK\Lib\IA64\mfc
と2つ出てきたのでそれぞれ個別にpathを通してコンパイルをかけたところ
どっちも同じエラーが出ました
エラー 1 fatal error LNK1112: モジュールのコンピュータの種類 'IA64' は対象コンピュータの種類 'X86' と競合しています。 uafxcwd.lib
ここまでしました。
後はどのようにして解決を試みればいいでしょうか?
Re:windowsとstlの文字列操作
Posted: 2007年3月12日(月) 01:39
by Justy
代替案を。
これは
http://hw001.gate01.com/eggplant/tcf/cp ... _trap.htmlにある strcnv.hppを使用した例です。
[color=#d0d0ff" face="monospace] std::locale::global(std::locale("japanese"));
typedef std::basic_string<TCHAR> tstring;
tstring tstr;
const std::string str("テスト123");
MBCStoWCS(tstr, str);
TextOut(hdc, 10, 10, tstr.c_str(), tstr.size());
[/color]
TCHARがワイド文字だとして、stringクラスが持っているマルチバイト文字列をワイド文字列に変換しています。
Re:windowsとstlの文字列操作
Posted: 2007年3月12日(月) 13:18
by Blue
> Microsoft Visual Studio 2005
> インストールされている Edition: VC Express
ではATL、MFCのライブラリを使うことはできませんよ。
(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)
std::stringを使うのであれば、明にTextOutAをつかうとか。
もしくは、comdef.hの_bstr_tクラスを介するとか。
Re:windowsとstlの文字列操作
Posted: 2007年3月12日(月) 19:23
by 組木紙織
>std::stringを使うのであれば、明にTextOutAをつかうとか。
を使って成功しました。
ありがとうございます。
>(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)
確かにライブラリにx86と書いてあるフォルダは入っていませんでした。
前のはエラーの出力をそのまま出しただけなので細かい部分までは知らないので今のところ
実行ファイルが作れて、きちんと動けば問題はないです。
(仕事にすると、もっと詳しくバージョンのことについても知っておく必要があるかと思いますが、)
>ではATL、MFCのライブラリを使うことはできませんよ
こんな高機能な統合環境が無料であることには驚いていたんですが、無料であるにはそんな理由があったのですね。
コメントと書いてくださったお二人、ありがとうございました。
また分からないことがあったら宜しくお願いします。