c++, Win32API, WinAPI教程问题与宽字符



我有一个类型转换问题。

我的意思是:

FILE *file;

是char类型的,但我需要它是wchar_t类型的

我该怎么做?

当我用以下行编译程序时:

file = fopen(path,L"rb");

CodeBlocks抛出错误:

error: cannot convert 'char_t*' to 'const char*'

整个代码:

#include <windows.h>
#include <stdio.h>
#define OPEN_FILE_BUTTON 1
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
void AddControls(HWND);
HWND hMainWindow, hEdit;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)
{
WNDCLASSW wc = {0};
wc.hbrBackground = (HBRUSH) COLOR_WINDOW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hInstance = hInst;
wc.lpszClassName = L"myWindowClass";
wc.lpfnWndProc = WindowProcedure;
if(!RegisterClassW(&wc))
return -1;
hMainWindow = CreateWindowW(L"myWindowClass", L"My Window Title", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500,
NULL, NULL, NULL, NULL);
MSG msg = {0};
while(GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
void display_file(wchar_t* path)
{
FILE *file;
file = fopen(path,L"rb");
fseek(file, 0, SEEK_END);
int _size = ftell(file);
rewind(file);
wchar_t *data = new wchar_t(_size+2);
fread(data, _size, 1, file);
data[_size] = '';
SetWindowText(hEdit, data);
}
void open_file(HWND hWnd)
{
OPENFILENAMEW ofn;
wchar_t file_name[100];
ZeroMemory(&ofn,sizeof(OPENFILENAMEW));
ofn.lStructSize = sizeof(OPENFILENAMEW);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = file_name;
ofn.lpstrFile[0] = '';
ofn.nMaxFile = 100;
ofn.lpstrFilter = L"All files*.*Source Files*.cppText Files*.txt";
ofn.nFilterIndex = 1;
GetOpenFileNameW(&ofn);
void display_file(ofn.lpstrFile);
}

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg)
{
case WM_COMMAND:
{
switch(wp)
{
case OPEN_FILE_BUTTON:
open_file(hWnd);
break;
}
}
break;
case WM_CREATE:
AddControls(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hWnd, msg, wp, lp);
}
}
void AddControls(HWND hWnd)
{
CreateWindowW(L"Button", L"Open File", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 10, 10, 150, 36, hWnd, (HMENU)OPEN_FILE_BUTTON, NULL, NULL);
hEdit = CreateWindowW(L"Edit", L"Open File", WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_AUTOVSCROLL | WS_BORDER, 10, 50, 400, 300, hWnd, NULL, NULL, NULL);
}

代码来自Youtube教程:

用C/c++编写Windows GUI (Win32 API) | Part -8 |打开文件对话框

选自《pentamolis project》

https://www.youtube.com/watch?v=7K6HCeog09c&列表= PLWzp0Bbyy_3i750dsUj7yq4JrPOIUR_NK&指数= 8

问题是我想写宽字符版本。

谢谢你的回答。

不,谢谢你那些无用的回答。

:)

file = fopen(path,L"rb");

fopenwchar_t等价物为_wfopen

注意,您仍然使用FILE*_wfopen:

FILE *_wfopen(
const wchar_t *filename,
const wchar_t *mode
);
因此,考虑使用以下代码:
file = _wfopen(path, L"rb");

还请注意,您有以下代码:

wchar_t *data = new wchar_t(_size+2);

如果您打算分配一个wchar_ts数组,其中包含wchar_t类型的_size+2元素,则使用方括号代替圆括号:

wchar_t *data = new wchar_t[_size+2]; // Note the [ ]

还需要注意,您需要delete[]这个堆分配的数组。在现代c++中,更好的选择是使用std::vector这样的容器类。

有几个问题

你的路径是一个宽字符串,所以你可以使用(非标准)_wfopen代替fopen

你的分配不正确

wchar_t *data = new wchar_t(...);

分配一个字符,要分配多个字符,您需要方括号

wchar_t *data = new wchar_t[...];

最后,宽字符(在Windows上)有两个字节大,所以你需要小心你的大小计算。现在你正在混合字符和字节。

fseek(file, 0, SEEK_END);
int _size = ftell(file);

获取以字节为单位的大小,所以除以字符的长度

size /= sizeof(wchar_t);

现在分配正确的字符数(并使用[])

wchar_t *data = new wchar_t[_size+1];

现在读取字符,但是这个

fread(data, _size, 1, file);

读取_size的字节,我们想读取_size的字符,所以改成

fread(data, sizeof(wchar_t), _size, file);

所有完全未经测试的代码。

最新更新