Как конвертировать LPTSTR в LPCTSTR?

Мне нужно конвертировать:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx

lpstrFileTitle
Type: LPTSTR
The file name and extension (without path information) of the selected file. This member can be NULL.

Несмотря на то, что в MSVC++ 2012 Express написано LPSTR.

к

http://msdn.microsoft.com/en-us/library/windows/desktop/bb172802(v=vs.85).aspx

pSrcFile [in]
Type: LPCTSTR
Pointer to a string that specifies the filename. If the compiler settings require Unicode, the data type LPCTSTR resolves to LPCWSTR. Otherwise, the string data type resolves to LPCSTR. See Remarks.

Я был бы очень признателен за это.:)

char szFileName[MAX_PATH] = {0};
char szFileTitleName[MAX_PATH] = {0};
HRESULT hr = S_OK;
RtlZeroMemory(&gc.ofn, sizeof(gc.ofn));

gc.ofn.lStructSize      =   sizeof(gc.ofn);
gc.ofn.hwndOwner        =   hWnd;
gc.ofn.lpstrFilter      =   "All Image Files\0"              "*.bmp;*.dib;*.wdp;*.mdp;*.hdp;*.gif;*.png;*.jpg;*.jpeg;*.tif;*.ico\0"
"Windows Bitmap\0"               "*.bmp;*.dib\0"
"High Definition Photo\0"        "*.wdp;*.mdp;*.hdp\0"
"Graphics Interchange Format\0"  "*.gif\0"
"Portable Network Graphics\0"    "*.png\0"
"JPEG File Interchange Format\0" "*.jpg;*.jpeg\0"
"Tiff File\0"                    "*.tif\0"
"Icon\0"                         "*.ico\0"
"All Files\0"                    "*.*\0"
"\0";
gc.ofn.nMaxFileTitle = MAX_PATH;
gc.ofn.lpstrFileTitle = gc.szFileTitleName; // its a char
gc.ofn.lpstrFile       = szFileName;
gc.ofn.nMaxFile        = MAX_PATH;
gc.ofn.lpstrTitle      = "Open Image";
gc.ofn.Flags           = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;

if(GetOpenFileName(&gc.ofn)) {
gc.render_on = true;
}

,

D3DXCreateTextureFromFileEx (d3dDevice, gc.szFileTitleName , D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 0, 0,
        D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT,
        colorkey, &init_map->image_info, NULL, &init_map->texture_buffer)

Это будет иметь пустое изображение. Я проверил это с окном сообщения сразу после GetOpenFile, и он возвращается великолепно.

MessageBoxA ( NULL , gc.ofn.lpstrFileTitle , "" , 0 );

Но до D3DXCreateTextureFromFileEx, его перепутали.

Просто сохраняем символ в gc.szFileTitleName. Понятия не имею, почему другой путь выходил за рамки...

2 ответа

Решение

LPCTSTR это просто const версия LPTSTR, Этот тип преобразования является стандартным преобразованием, поэтому вам не нужно ничего делать явно, чтобы получить то, что вы хотите. Ваша ошибка должна быть где-то еще.

Если вы как-то не компилируете часть своего кода с UNICODE установить и некоторые без него...

GetOpenFileName(), D3DXCreateTextureFromFileEx(), а также MessageBox() все имеют дело с TCHARна основе строк, но вы на самом деле не используете TCHAR в вашем коде. Попробуйте это вместо этого:

TCHAR szFileName[MAX_PATH] = {0};
TCHAR szFileTitleName[MAX_PATH] = {0};
HRESULT hr = S_OK;
RtlZeroMemory(&gc.ofn, sizeof(gc.ofn));

gc.ofn.lStructSize      =   sizeof(gc.ofn);
gc.ofn.hwndOwner        =   hWnd;
gc.ofn.lpstrFilter      =   TEXT("All Image Files\0")              TEXT("*.bmp;*.dib;*.wdp;*.mdp;*.hdp;*.gif;*.png;*.jpg;*.jpeg;*.tif;*.ico\0")
                            TEXT("Windows Bitmap\0")               TEXT("*.bmp;*.dib\0")
                            TEXT("High Definition Photo\0")        TEXT("*.wdp;*.mdp;*.hdp\0")
                            TEXT("Graphics Interchange Format\0")  TEXT("*.gif\0")
                            TEXT("Portable Network Graphics\0")    TEXT("*.png\0")
                            TEXT("JPEG File Interchange Format\0") TEXT("*.jpg;*.jpeg\0")
                            TEXT("Tiff File\0")                    TEXT("*.tif\0")
                            TEXT("Icon\0")                         TEXT("*.ico\0")
                            TEXT("All Files\0")                    TEXT("*.*\0")
                            TEXT("\0");
gc.ofn.nMaxFileTitle = MAX_PATH;
gc.ofn.lpstrFileTitle = gc.szFileTitleName;
gc.ofn.lpstrFile       = szFileName;
gc.ofn.nMaxFile        = MAX_PATH;
gc.ofn.lpstrTitle      = TEXT("Open Image");
gc.ofn.Flags           = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;

if(GetOpenFileName(&gc.ofn)) {
    gc.render_on = true;
}

,

D3DXCreateTextureFromFileEx (d3dDevice, gc.szFileTitleName , D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, colorkey, &init_map->image_info, NULL, &init_map->texture_buffer)

,

MessageBox(NULL, gc.ofn.lpstrFileTitle, TEXT(""), 0);
Другие вопросы по тегам