3

Visual Studio c ++を使用していて、CstringをByteに変換したいと思います。このコードを作成しましたが、2行目に「データ」が未定義であるというエラーが表示されました。

CString data = _T( "OK");
LPBYTE pByte = new BYTE[data.GetLength() + 1];
memcpy(pByte, (VOID*)LPCTSTR(data), data.GetLength());

さらに、strcmp関数のためにLPBYTEをconstcharに変換する必要があります。コードを記述しましたが、問題が見つかりません。

const LPBYTE lpBuffer;
LPBYTE lpData = lpBuffer;
CString rcvValue(LPCSTR(lpBuffer));
const CHAR* cstr = (LPCSTR)rcvValue;
if (strcmp (cstr,("ABC")) == 0)
{
    ////
}
4

5 に答える 5

1

以下のように、CString の定義を提供するために atlstr.h を必ず含めてください。

#include "stdafx.h"
#include <Windows.h>
#include <atlstr.h>

int _tmain(int argc, _TCHAR* argv[])
{
    CString data = _T( "OK");
    LPBYTE pByte = new BYTE[data.GetLength() + 1];
    memcpy(pByte, (VOID*)LPCTSTR(data), data.GetLength());
    return 0;
}
于 2012-09-10T17:44:27.933 に答える
1

最初の質問については、ジェイが正しいと確信しています。正しいヘッダーを含める必要があります。

2 番目の質問ですが、なぜそのコードが機能すると思いますか? あなたが書いたコードが実際に何をするかを見ていきましょう。

  1. 初期化せずに char ポインタ (char *) を作成します。これにより、lpData/lpBuffer がメモリ内のランダムな場所を指すようになります。
  2. CString を作成し、このランダム ポインターで初期化します。
  3. CString からバッファーを抽出し、それを文字列リテラルと比較します。

CString にはランダムなガベージが含まれていることを念頭に置いて、このコードは正確に何をすると思いますか? (恐るべしクラッシュ以外?=))

また、文字列へのアプローチをより一貫させる必要があることも指摘したいと思います。最初のセクションでの TCHAR の使用が示唆するように、char ベースと wchar_t ベースの文字列の両方をサポートする予定はありますか? C スタイルの文字列を使用しますか、それとも CString のようなオブジェクトを使用しますか? CString を使用する場合は、CString が提供する Compare 関数を使用してください。strcmp を気にしないでください。

于 2012-09-10T18:22:34.117 に答える
-1

おそらく重要なヘッダーが含まれていませんでした

    #include <afx.h>

    int main()
    {                   
        CString data = _T( "OK");
        LPBYTE pByte = new BYTE[data.GetLength() + 1];
        memcpy(pByte, (VOID*)LPCTSTR(data), data.GetLength());

        return 0;
    }

このコードは正常に動作します。

于 2012-09-10T17:51:39.540 に答える