![](/img/trans.png)
[英]LoadLibrary failure: %1 is not a valid Win32 application. in R
[英]Win32 Application failure
我的应用程序在 visual studio 2019 中编译成功,但是当我尝试在 Code::Blocks (Mingw64) 中编译此代码时,它失败了。
首先,我两次收到此错误消息: error: cannot convert 'const wchar_t*' to 'LPCSTR' {aka 'const char*'}
所以我通过替换这个解决了这个问题:
AppendMenu(HSUBMENU, MF_STRING, FILE_MENU_EXIT, L"Quit");
AppendMenu(MENU1, MF_POPUP, (UINT_PTR)HSUBMENU, L"FILE");
有了这个:
AppendMenu(HSUBMENU, MF_STRING, FILE_MENU_EXIT, "Quit");
AppendMenu(MENU1, MF_POPUP, (UINT_PTR)HSUBMENU, "FILE");
所以,这个问题解决了,但是还有一个错误:
error: cannot convert 'LPSTR' {aka 'char*'} to 'LPCWSTR' {aka 'const wchar_t*'} in assignment
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
我卡在了这个错误上
以下是在 Visual Studio 中编译成功但在 Code::Blocks 中编译失败的原始源代码。
我需要帮助。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "resource.h"
#define FILE_MENU_EXIT 3
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void AddMenue(HWND hwnd)
{
HMENU MENU1(0), HSUBMENU(0);
HSUBMENU = CreateMenu();
MENU1 = CreateMenu();
AppendMenu(HSUBMENU, MF_STRING, FILE_MENU_EXIT, L"Quit");
AppendMenu(MENU1, MF_POPUP, (UINT_PTR)HSUBMENU, L"FILE");
SetMenu(hwnd, MENU1);
}
HMENU hmenu;
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PWSTR pCmdLine, int nCmdShow) {
MSG msg;
HWND hwnd;
WNDCLASSW wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.lpszClassName = L"Window";
wc.hInstance = hInstance;
wc.hbrBackground = /*(HBRUSH)(COLOR_WINDOW+4);*/GetSysColorBrush(COLOR_3DFACE);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassW(&wc);
hwnd = CreateWindowW(wc.lpszClassName, L"Window",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
// pas necessaire UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE:
AddMenue(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
您的某些代码使用基于 TCHAR 的 API,但没有使用基于 TCHAR 的字符串。 并且您的一些代码使用 Unicode API 而没有使用 Unicode 字符串。 这就是您收到转换错误的原因。
具体来说...
这段代码:
AppendMenu(HSUBMENU, MF_STRING, FILE_MENU_EXIT, L"Quit");
AppendMenu(MENU1, MF_POPUP, (UINT_PTR)HSUBMENU, L"FILE");
需要是以下之一,因为AppendMenu()
是基于TCHAR
的宏:
AppendMenu(HSUBMENU, MF_STRING, FILE_MENU_EXIT, TEXT("Quit"));
AppendMenu(MENU1, MF_POPUP, (UINT_PTR)HSUBMENU, TEXT("FILE"));
或者这个,如果你想专门使用 Unicode 字符串:
AppendMenuW(HSUBMENU, MF_STRING, FILE_MENU_EXIT, L"Quit");
AppendMenuW(MENU1, MF_POPUP, (UINT_PTR)HSUBMENU, L"FILE");
这段代码:
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
需要如下,因为您使用的是基于 Unicode 的WNDCLASSW
而不是基于 TCHAR 的WNDCLASS
( MAKEINTRESOURCE()
是基于 TCHAR 的):
wc.lpszMenuName = MAKEINTRESOURCEW(IDR_MENU1);
这段代码:
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
需要如下,因为您使用了基于 Unicode 的RegisterClassW()
和CreateWindowW()
而不是基于 TCHAR 的RegisterClass()
和CreateWindow()
:
while (GetMessageW(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
您确实需要选择一种编码方案并始终如一地坚持下去。 要么使用所有基于 TCHAR 的 API,要么使用所有基于 Unicode 的 API。 不要混淆它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.