windowsとstlの文字列操作

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
組木紙織

windowsとstlの文字列操作

#1

投稿記事 by 組木紙織 » 18年前

現在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

となります。
解決策を知っている方がおられたら、コメントをお願いします。

Justy

Re:windowsとstlの文字列操作

#2

投稿記事 by Justy » 18年前

 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の文字列操作

#3

投稿記事 by 組木紙織 » 18年前

以下のようにすると次のようなエラーが出ました。
///////////
エラー 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のリファレンスも読みにくいし分かりにくいし。

box

Re:windowsとstlの文字列操作

#4

投稿記事 by box » 18年前

> エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\tet\project\win1\s2\p1.cpp 23

p1.cppの23行目は、どういう内容ですか?
投稿されたソースの一部に含まれていますか?

組木紙織

Re:windowsとstlの文字列操作

#5

投稿記事 by 組木紙織 » 18年前

すみません。ちょうどそのところを出していたのですが。
上のソースの
>const CString cstr(str.c_str());
の部分に当たります。

Justy

Re:windowsとstlの文字列操作

#6

投稿記事 by Justy » 18年前

 CStringが定義された atlstr.hヘッダはインクルードされていますか?
 されていなければしてみて下さい。

組木紙織

Re:windowsとstlの文字列操作

#7

投稿記事 by 組木紙織 » 18年前

インクルードできないようです。
ファイルが見つからないとのエラーが出ます。

Justy

Re:windowsとstlの文字列操作

#8

投稿記事 by Justy » 18年前

 ひょっとして 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の文字列操作

#9

投稿記事 by 組木紙織 » 18年前

win32アプリケーションを作るために入れたはずなんですが、インクルードできないということは
設定が完了していないということですよね。
パスをちょっと調べてみます。
で、出来なかったら再インストールで入れなおしてみます。

組木紙織

Re:windowsとstlの文字列操作

#10

投稿記事 by 組木紙織 » 18年前

flatformSDKの設定は以前にしてありました。パスも確認してみましたが、間違ってはいなかったです。
atlstr.hのファイルが存在するかどうか検索をかけたところ、何処にも存在しないようです。

Justy

Re:windowsとstlの文字列操作

#11

投稿記事 by Justy » 18年前

 うちのバージョンなら "atlstr.h"があるのですが、
"atlmisc.h"かもしれません。
 もし "atlmisc.h"あったら、それをインクルードしてみて下さい。

組木紙織

Re:windowsとstlの文字列操作

#12

投稿記事 by 組木紙織 » 18年前

platformSDKをcompleteで再インストールしてみましたが、状況に何も変化がありません。
ヘッダーファイルも検索をかけて入っているか確認してみたのですが、どちらも存在しませんでした。

あきらめたほうがいいのかな。

Justy

Re:windowsとstlの文字列操作

#13

投稿記事 by Justy » 18年前

 では afx.hはどうでしょう。

組木紙織

Re:windowsとstlの文字列操作

#14

投稿記事 by 組木紙織 » 18年前

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

Justy

Re:windowsとstlの文字列操作

#15

投稿記事 by Justy » 18年前

 afxver_.hがコンパイラから見えていないようです。
 まずそのファイルがあるかどうかを探して、
見つかったらそのディレクトリにパスが通っているか確認してみて下さい。

組木紙織

Re:windowsとstlの文字列操作

#16

投稿記事 by 組木紙織 » 18年前

#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

ここまでしました。
後はどのようにして解決を試みればいいでしょうか?

Justy

Re:windowsとstlの文字列操作

#17

投稿記事 by Justy » 18年前

 代替案を。
 これは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クラスが持っているマルチバイト文字列をワイド文字列に変換しています。

Blue

Re:windowsとstlの文字列操作

#18

投稿記事 by Blue » 18年前

> Microsoft Visual Studio 2005
> インストールされている Edition: VC Express
ではATL、MFCのライブラリを使うことはできませんよ。
(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)

std::stringを使うのであれば、明にTextOutAをつかうとか。
もしくは、comdef.hの_bstr_tクラスを介するとか。

組木紙織

Re:windowsとstlの文字列操作

#19

投稿記事 by 組木紙織 » 18年前

>std::stringを使うのであれば、明にTextOutAをつかうとか。

を使って成功しました。
ありがとうございます。

>(Platform SDKにあるのは古いもので、さらに~.libもx86版もなかったような)
確かにライブラリにx86と書いてあるフォルダは入っていませんでした。
前のはエラーの出力をそのまま出しただけなので細かい部分までは知らないので今のところ
実行ファイルが作れて、きちんと動けば問題はないです。
(仕事にすると、もっと詳しくバージョンのことについても知っておく必要があるかと思いますが、)


>ではATL、MFCのライブラリを使うことはできませんよ
こんな高機能な統合環境が無料であることには驚いていたんですが、無料であるにはそんな理由があったのですね。

コメントと書いてくださったお二人、ありがとうございました。
また分からないことがあったら宜しくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る