windowsとstlの文字列操作
windowsとstlの文字列操作
現在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
となります。
解決策を知っている方がおられたら、コメントをお願いします。
例えば、
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の文字列操作
stringクラスが、std::stringのことだったとして、
CStringにクラスに変換して、それをそのまま APIに突っ込むってのはどうでしょう。
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の文字列操作
以下のようにすると次のようなエラーが出ました。
///////////
エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\tet\project\win1\s2\p1.cpp 23
////////////
#include<windows.h>
#include<string>
//ソースの一部
インクルードしないといけないのかなとおもってmsdnのリファレンスで調べてみたのだが良くわかりませんでした。
まだまだ始めたばかりなので、良くわからないことばかりで大変です。
msdnのリファレンスも読みにくいし分かりにくいし。
///////////
エラー 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の文字列操作
> エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\tet\project\win1\s2\p1.cpp 23
p1.cppの23行目は、どういう内容ですか?
投稿されたソースの一部に含まれていますか?
p1.cppの23行目は、どういう内容ですか?
投稿されたソースの一部に含まれていますか?
Re:windowsとstlの文字列操作
すみません。ちょうどそのところを出していたのですが。
上のソースの
>const CString cstr(str.c_str());
の部分に当たります。
上のソースの
>const CString cstr(str.c_str());
の部分に当たります。
Re:windowsとstlの文字列操作
ひょっとして PlatformSDKが入っていないんでしょうか。
http://www.microsoft.com/japan/msdn/vst ... usingpsdk/
入っていなければ入れてみて下さい。
# std::stringを使わないで
typedef std::basic_string<TCHAR> tstring;
を定義した上で、tstringクラスをを使うってのではだめですかね。
これなら
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の文字列操作
win32アプリケーションを作るために入れたはずなんですが、インクルードできないということは
設定が完了していないということですよね。
パスをちょっと調べてみます。
で、出来なかったら再インストールで入れなおしてみます。
設定が完了していないということですよね。
パスをちょっと調べてみます。
で、出来なかったら再インストールで入れなおしてみます。
Re:windowsとstlの文字列操作
flatformSDKの設定は以前にしてありました。パスも確認してみましたが、間違ってはいなかったです。
atlstr.hのファイルが存在するかどうか検索をかけたところ、何処にも存在しないようです。
atlstr.hのファイルが存在するかどうか検索をかけたところ、何処にも存在しないようです。
Re:windowsとstlの文字列操作
うちのバージョンなら "atlstr.h"があるのですが、
"atlmisc.h"かもしれません。
もし "atlmisc.h"あったら、それをインクルードしてみて下さい。
"atlmisc.h"かもしれません。
もし "atlmisc.h"あったら、それをインクルードしてみて下さい。
Re:windowsとstlの文字列操作
platformSDKをcompleteで再インストールしてみましたが、状況に何も変化がありません。
ヘッダーファイルも検索をかけて入っているか確認してみたのですが、どちらも存在しませんでした。
あきらめたほうがいいのかな。
ヘッダーファイルも検索をかけて入っているか確認してみたのですが、どちらも存在しませんでした。
あきらめたほうがいいのかな。
Re:windowsとstlの文字列操作
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
/*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の文字列操作
afxver_.hがコンパイラから見えていないようです。
まずそのファイルがあるかどうかを探して、
見つかったらそのディレクトリにパスが通っているか確認してみて下さい。
まずそのファイルがあるかどうかを探して、
見つかったらそのディレクトリにパスが通っているか確認してみて下さい。
Re:windowsとstlの文字列操作
#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
ここまでしました。
後はどのようにして解決を試みればいいでしょうか?
エラー 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の文字列操作
代替案を。
これはhttp://hw001.gate01.com/eggplant/tcf/cp ... _trap.htmlにある strcnv.hppを使用した例です。
これは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の文字列操作
> Microsoft Visual Studio 2005
> インストールされている Edition: VC Express
ではATL、MFCのライブラリを使うことはできませんよ。
(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)
std::stringを使うのであれば、明にTextOutAをつかうとか。
もしくは、comdef.hの_bstr_tクラスを介するとか。
> インストールされている Edition: VC Express
ではATL、MFCのライブラリを使うことはできませんよ。
(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)
std::stringを使うのであれば、明にTextOutAをつかうとか。
もしくは、comdef.hの_bstr_tクラスを介するとか。
Re:windowsとstlの文字列操作
>std::stringを使うのであれば、明にTextOutAをつかうとか。
を使って成功しました。
ありがとうございます。
>(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)
確かにライブラリにx86と書いてあるフォルダは入っていませんでした。
前のはエラーの出力をそのまま出しただけなので細かい部分までは知らないので今のところ
実行ファイルが作れて、きちんと動けば問題はないです。
(仕事にすると、もっと詳しくバージョンのことについても知っておく必要があるかと思いますが、)
>ではATL、MFCのライブラリを使うことはできませんよ
こんな高機能な統合環境が無料であることには驚いていたんですが、無料であるにはそんな理由があったのですね。
コメントと書いてくださったお二人、ありがとうございました。
また分からないことがあったら宜しくお願いします。
を使って成功しました。
ありがとうございます。
>(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)
確かにライブラリにx86と書いてあるフォルダは入っていませんでした。
前のはエラーの出力をそのまま出しただけなので細かい部分までは知らないので今のところ
実行ファイルが作れて、きちんと動けば問題はないです。
(仕事にすると、もっと詳しくバージョンのことについても知っておく必要があるかと思いますが、)
>ではATL、MFCのライブラリを使うことはできませんよ
こんな高機能な統合環境が無料であることには驚いていたんですが、無料であるにはそんな理由があったのですね。
コメントと書いてくださったお二人、ありがとうございました。
また分からないことがあったら宜しくお願いします。