プロが教える店舗&オフィスのセキュリティ対策術

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;
}

A 回答 (1件)

VC2005以降はUnicodeが標準でありwchar_tやwchar_t*を使うことになります


マルチバイト(シフトJIS)系を使用するのであれば

プロジェクト > プロパティ > 全般の中の
『文字セット』を『マルチバイト文字セットを使用する』に変更してみましょう

Unicode/マルチバイト双方でソースをいじらなくてもすむようにするなら
LPCSTRをLPCTSTR、LPSTRをLPTSTR
といった具合に双方で別々である型指定を統合するマクロを使いましょう
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!