• 締切済み

CStringWの使われ方が判らないので‥‥

{ CString cs; CStringW ws; cs.Format("%-32s",(LPCSTR)m_VolumeLabel); ws = cs; ByteSwapCopy(pvd+0x28,(LPCWSTR)ws,32); } ***************************************************************** { CString cs; CString ws; cs.Format("%-32s",(LPCSTR)m_VolumeLabel); ws = cs; ByteSwapCopy(pvd+0x28,(LPCTSTR)ws,32); } 上のコードがあるのですが (抜粋です)下のように書き換えればよいのですか? 教えてください。

みんなの回答

回答No.1

いかなる結果を期待しているのかわからないので答えようがありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CStringとCByteArrayの変換

    いつもお世話になっています。 MFCのCStringクラスとCByteArrayを相互に変換したいと考えているのですが、どうもうまくいきません。 文字コードはユニコードを想定しています。 ====================================================== CByteArray data; CString cs1 = _T("あいうえお"); CString cs2; LPBYTE lpByte = (LPBYTE)(LPCTSTR)cs1.GetBuffer(); data.SetSize(cs1.GetLength() * sizeof(TCHAR)); CopyMemory(data.GetData(), lpByte, data.GetSize()); cs1.ReleaseBuffer(); cs2 = (LPCTSTR)data.GetData(); AfxMessageBox(cs2); ====================================================== (現在の出力状況) あいうえお・・・・ 文字は正しく出力されますが、語尾に文字化けしたようなものがつきます。 他に良い方法があればよろしくお願いします。

  • エディットボックスで複数行入力するには

    スタイルは const DWORD dwStyle = WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_READONLY; 処理は CEdit m_edit; CString buf ; m_edit.GetWindowTextW((LPTSTR)(LPCTSTR)buf, 0); m_edit.SetWindowTextW( buf + mes + _T("\x0d\n")); いろいろためしたのですが、どうしても1行目を書き換えて表示 してしまいます。 文字列を行でどんどん追加していくにはどうすればいいんでしょうか?

  • CString ←→ BSTRの変換について

    次のコードのように、CString ←→ BSTRの変換を行いたいのですが、データがUTF8だと文字化けしてしまいます。 どうすれば良いでしょうか? 環境:VC++7(.net 2003)+MFC+WinXP 【結果】 CString-------------------------- FFFFFFE2 FFFFFF97 FFFFFF8B 3C BSTR-------------------------- FFFFFFE2 FFFFFF97 FFFFFF81 45 【ソース】 int intCT; int nSize = 0; BYTE *pSource = (BYTE *)"○<"; this->ConvSJistoUtf8(pSource, (BYTE *)NULL, &nSize ); BYTE* pDist = new BYTE[ nSize + 1 ]; ZeroMemory( pDist, nSize + 1 ); this->ConvSJistoUtf8(pSource, pDist, &nSize ); CString str = CString(pDist); delete []pDist; pDist = NULL; BSTR bstr; bstr=str.AllocSysString();//CString→BSTRへの変換 CString str2=CString(bstr);//BSTR→CStringへの変換 TRACE("CString--------------------------\n "); for( intCT = 0; intCT < str.GetLength(); intCT++ ) { if( intCT%16 == 0 ) TRACE("\n"); TRACE("%02X " , str[intCT]); } TRACE("\n "); TRACE("BSTR--------------------------\n "); for( intCT = 0; intCT < str2.GetLength(); intCT++ ) { if( intCT%16 == 0 ) TRACE("\n"); TRACE("%02X " , str2[intCT]); } TRACE("\n "); BOOL ConvSJistoUtf8( BYTE* pSource, BYTE* pDist, int* pSize ) { *pSize = 0; //ShiftJISからUTF-16へ変換 const int nSize = ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, NULL, 0 ); BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ]; ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, (LPWSTR) buffUtf16, nSize ); //UTF-16からShift-JISへ変換 const int nSizeUtf8 = ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR) buffUtf16, -1, NULL, 0, NULL, NULL ); if( !pDist ){ *pSize = nSizeUtf8; delete buffUtf16; return TRUE; } BYTE* buffUtf8 = new BYTE[ nSizeUtf8 * 2 ]; ZeroMemory( buffUtf8, nSizeUtf8 * 2 ); ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)buffUtf16, -1, (LPSTR) buffUtf8, nSizeUtf8, NULL, NULL ); *pSize = lstrlen( (char*)buffUtf8 ); memcpy( pDist, buffUtf8, *pSize ); delete buffUtf16; delete buffUtf8; return TRUE; }

  • キャストについて str = (CString*)("999") ;

    環境 WIN98 VC++6.0 MFC にて いつもお世話になります。 先日質問したばかり(QNo.682705)なのですが、やはり納得できないことがあるのでお願いします。 分かっている人からみれば、おかしな疑問と思われるかも知れませんが、私にとっては素朴に疑問が生じてしまいます。 *************************** 以下2つのコードのうち、<A>は文法的にOKで<B>がNGな理由が知りたいです。 <A> CString* str ; str = (CString*)m_array.GetAt(i) ; //OK <B> CString* str ; str = (CString*)("999") ; //NG <A>は、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。 と教わりましたが、むしろ私にはCString*以外が入っているため、CString*のキャストしていると思える。 CString*が入っているのなら、キャストする必要は無いのではないでしょうか? ネット上で見つけたコードなため、実際の値やm_arrayの宣言がどうなっているかは確認出来ません。 そして、<A>がおかしなコードでは無いという大前提にたつと、<A>は別の表現をすると <A> str = (CString*)(CString*以外のポインタ) ; となります。 そうすると<B>のコードも、"999"は999の文字列が入っているアドレスを指すポインタであるという考えが正しいとすると、 <B> str = (CString*)(999をさすポインタ) ; となり、おかしなコードではないと思えるのですが、考え方のどこがおかしいのでしょうか? ************************** 以下のことを教わった上であえて聞いています。 str = (CString*)("999"); は、リテラル文字列をつっこもうとしています。 リテラル文字列とCStringはまったく別物です。

  • CTime.Formatが(NULL)に??

    下記コードのstrをエディットボックスで表示すると(null)と表示されてしまいます。 スレッドを起動した中で、親クラスのstrGetTextにデータを入れておいて、 WM_MKLOGのメッセージで親クラス内のエディットボックスに取得データと時間 を表示させようと思っています。 このとき(%s)の部分が((null))と表示されてしまいます。 すいませんがどなたか教えていただけますでしょうか? { CTime ctime; CString str; ctime = CTime::GetCurrentTime(); // 現在時刻取得 str = ctime.Format("%Y%m%d%H%M%S"); // "YYYYmmddHHMMSS"形式に変換 mycls->strGetText.Format(_T("取得 0x%x (%s)\r\n"), data,str); } PostMessage(mycls->m_hWnd, WM_MKLOG, 0, 0);

  • VS2013(MFC)の表示文字化けについて

    今日は MSのcommunityからダウンロードしました『VS2013のMFC』でテストの『App』を作成しています。 『VS2013(MFC)』をdownLoad、インストールしましたが、英語版がインストールになりました。 Q1)英語版を日本語版に変更する方法はありますか? Q2)この英語版では、ボタンの表示を日本語にしましたが化けて(判読不明の漢字)しまいますが、   日本語版に変更しますとこの化けはなくなりますか?   例えば "Button1"を"テスト"に変更します。 Q3)Formに配置しましたButton1を押しまして、EditBoxに、下記の如く"aaa"とか    "AAAAA”の表示をしますが、この表示も化けてしまいます(判読不明の漢字)  これも、日本語版に変更しますとこの化けはなくなりますか? ================================ void CMFCApplication1View::OnBnClickedButton1(){ // TODO: Add your control notification handler code here CString str; char cc[10]; strcpy_s(cc, (LPCSTR)(_T("aaa"))); m_edit1.SetWindowTextW((LPCTSTR)("AAAAA")); m_edit1.SetWindowTextW((LPCTSTR)(cc)); } ============================= 以上、コメントのほど、宜しくお願いします。

  • error C2440: 'static_cast' : 'CString' から 'LPCSTR' に変換できません

    CStringから LPCSTR型への変換orその逆について教えて下さい。 Visal Studio 2005のC++で以下のサンプルを動かしました。 http://www.g-ishihara.com/mfc_nw_01.htm すると、以下のプログラムを実行させると、IとIIでエラーが発生しました。 I  byteCP = static_cast<LPCSTR>(sendStr) +sendSum; error C2440: 'static_cast' : 'CString' から 'LPCSTR' に変換できません。 II  byteP = recvStr.GetBuffer(21); error C2440: '=' : 'wchar_t *' から 'LPSTR' に変換できません。 学習のため、サンプルに従って進めていきましたが、 そこでつまずいてしまいました。 CStringについては、全く知識がありません。 ご存じの方、教えて下さい。 void CClientSockDlg::OnBnClickedBtnSend() { CSocket sock; unsigned int port = 0; CString sendStr, recvStr; int send, recv, sendSum, recvSum; LPCSTR byteCP = NULL; LPSTR byteP = NULL; int err = 0; UpdateData(); // (1)ソケット作成 if (!err) if (!sock.Create()) err = 1; // (2)ポート取得 if (!err) if (_stscanf_s(m_xvEditPort, _T("%d"), &port) != 1) err = 1; // (3)接続 if (!err) if (!sock.Connect(m_xvEditIP, port)) err = 1; // (4)送信(20バイト固定) if (!err) { sendStr = m_xvEditMes; while (sendStr.GetLength() < 20) sendStr += _T(" "); sendStr = sendStr.Left(20); sendSum = 0; while (sendSum < 20) { byteCP = static_cast<LPCSTR>(sendStr) +sendSum; //------- I send = sock.Send(byteCP, 20 -sendSum); if (send == SOCKET_ERROR) {err = 1; break;} sendSum += send; } } if (!err) { m_xvEditLog += _T("Send : "); m_xvEditLog += sendStr +_T("\r\n"); } // (5)受信(20バイト固定) if (!err) { byteP = recvStr.GetBuffer(21);  //------- II recvSum = 0; while (recvSum < 20) { recv = sock.Receive(byteP +recvSum, 20 -recvSum); if (recv == SOCKET_ERROR || recv == 0) {err = 1; break;} recvSum += recv; } byteP[20] = '\0'; recvStr.ReleaseBuffer(); } if (!err) { m_xvEditLog += _T("Recv : "); m_xvEditLog += recvStr +_T("\r\n"); } // (6)エラー表示 if (err) { LPVOID lpMsgBuf = NULL; ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, sock.GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); m_xvEditLog += _T("Error : "); m_xvEditLog += static_cast<LPTSTR>(lpMsgBuf); UpdateData(FALSE); LocalFree(lpMsgBuf); } // (7)切断 sock.Close(); UpdateData(FALSE); return; }

  • マウスポインタの形状

    よろしくお願いします。 環境 WIN98 VC++6.0 MFC SDIにて http://www.net24.ne.jp/~kenji/s_swin/swin.htmlにあるウィンドウを生成した場合、 クライアント領域にあるマウスポインタの形が、エッジを触ってウィンドウの大きさを変える上下矢印や左右矢印に変わってしまうことがあります。 マウスポインタがクライアント領域にある時は、常に一般的な形(左上をさす白く太い形)にするにはどうすれば良いのですか? お分かりの方よろしくお願いいたします。 *********************** ウィンドウのスタイル LPCTSTR lpszClassName; CRect rect( 0, 0, 640, 480); HCURSOR hCursor = 0; DWORD dwStyle, dwExStyle; lpszClassName = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, hCursor); dwExStyle = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE; dwStyle = WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU | WS_BORDER | WS_THICKFRAME; CreateEx( dwExStyle, lpszClassName, _T("Test window"), dwStyle, rect, parent, NULL, NULL);

  • (MFC)コンボボックスの値を数値比較

    VC++2005のMFCにてアプリケーションを作成しています。 コンボボックス(Ctrl変数:m_xcStMonth)に入力された値の、 正常値入力チェックとして、「1」から「12」までの数値ならtrue、 それ以外の数値及び文字列ならfalseを返す機能を実装したいのですが、 下記プログラムだと、「2」を入力しても、比較関数(1)(2)の戻り値として、 (1)RetMonth1には正常値「1」を返すのですが、 (2)RetMonth2にも誤り値「1」を返してしまいます。 原因として、「2」と「12」を比較した際に、 それぞれ一文字目の「2」と「1」を比較してしまうので、 誤り値を返してしまうようです。 下記が問題のソースコードです。 案1が比較関数にstrcpy_s()を使用した場合、 案2が比較関数CString::Compare()を使用した場合です。 両方において、RetMonth2に誤った戻り値を返しています。 もし何か良い改善策、より効率の良い実装方法などご存知の方おられましたら、 お手数ですが、ご教授お願い致します。 【案1】 CString StMinMonth; CString StMaxMonth; StMinMonth.Format( "%d", 1 ); StMaxMonth.Format( "%d", 12 ); CString StMonth; m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得 char CmpMonth [ MAX_WORD_SIZE + 1 ] = ""; char CmpMinMonth[ MAX_WORD_SIZE + 1 ] = ""; char CmpMaxMonth[ MAX_WORD_SIZE + 1 ] = ""; strcpy_s( CmpMonth, MAX_WORD_SIZE + 1, StMonth ); strcpy_s( CmpMinMonth, MAX_WORD_SIZE + 1, StMinMonth ); strcpy_s( CmpMaxMonth, MAX_WORD_SIZE + 1, StMaxMonth ); int RetMonth1 = strcmp( CmpMonth, CmpMinMonth ); //(1) int RetMonth2 = strcmp( CmpMonth, CmpMaxMonth ); //(2) if( ( RetMonth1 < 0 ) || ( RetMonth2 > 0 ) ) { return false; } return true; 【案2】 CString StMinMonth; CString StMaxMonth; StMinMonth.Format( "%d", 1 ); StMaxMonth.Format( "%d", 12 ); CString StMonth; m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得 int RetMonth1 = StMonth.Compare( StMinMonth ); //(1) int RetMonth2 = StMonth.Compare( StMaxMonth ); //(2) if( ( RetMonth1 < 0 ) || ( RetMonth2 > 0 ) ) { return false; } return true;

  • ポインタのポインタを引数にもった関数から値を得たい

    すいません。 似たような題も多かったのですが、初心者のため、わかりませんでした。 質問させてください。  ポインタのポインタを引数にもった関数を作りたいのですが、まったくわかりません。 (ポインタであれば、何とかできたのですが…) 例を作ってみました。下記で、dd[2][2]にtest2関数から値を得るとします。 ?1と?2、?3に何を入れたらよいでしょうか?  (?1で得られる値は何でもかまいません。) きわめて抽象的で、申し訳ないのですが、どうぞよろしくお願い致します。 void test2(double **d1) { ?1 } void C_testDlg::OnBnClickedButton1() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 double dd[2][2]; ?2 test2(?3); CString cs; cs.format("%g", dd[1][2]) ::AfxmessageBox(cs); }