0

現在、C 文字列ヘッダーと C++ を使用していますが、問題が発生しました。私は長い道のりを持っています:

C:\bla\bla\bla\bla

関数が正しく読み取れるように、バックスラッシュを二重のバックスラッシュに変更する必要がありOS_CopyFile()ますが、方法がわかりません。

次を使用してパスを取得します。

CHAR* szValueBuf = NULL;
DWORD cchValueBuf = 0;
UINT uiStat =  MsiGetProperty(hInstall, TEXT("OriginalDatabase"), TEXT(""), &cchValueBuf);

if (ERROR_MORE_DATA == uiStat)
{
    ++cchValueBuf; 
    szValueBuf = new TCHAR[cchValueBuf];
    if (szValueBuf)
    {
        uiStat = MsiGetProperty(hInstall, TEXT("OriginalDatabase"), szValueBuf, &cchValueBuf);
    }
}
if (ERROR_SUCCESS != uiStat)
{
    if (szValueBuf != NULL) 
        delete[] szValueBuf;
    return ERROR_INSTALL_FAILURE;
}
4

3 に答える 3

1

元の文字列を一度に 1 文字ずつコピーして、バックスラッシュが表示されたら、そのコピーにバックスラッシュを追加してみませんか?

しかし、他の人が指摘したように、文字列がソースにハードコードされていない場合などは、おそらくこれを行う必要はありません。

于 2012-08-27T12:49:03.580 に答える
0

実行時に C 変数に表示する文字列がある場合、バックスラッシュが変更されるリスクはありません。

C 文字列のバックスラッシュは、ソース コードを解析するときに C コンパイラだけに特別なものであり、たとえば"\n"単一の改行文字を含む文字列に置き換えられます。この置換は実際の文字列リテラルでのみ発生し、実行時にメモリ内で発生することはありません。

于 2012-08-27T12:49:17.677 に答える
0

C++ でバックスラッシュがどのように機能するかを誤解しています。文字列にはバックスラッシュが 1 つしかありません。文字列リテラルでは、コードで 2 つのバックスラッシュを使用して、実行時に文字列で 1 つのバックスラッシュを取得する必要があります。

OS_CopyFile(szValueBuf, "C:\\TEMP\\product.ini",0);

上記の文字列にはバックスラッシュが 2 つしかありません。あなたは存在しない問題を自分で発明しました。

于 2012-08-27T13:56:31.367 に答える