当我们使用WinMain或wWinMain时,是否有人知道我们何时需要使用Unicode函数而不是ANSI函数?或者我们可以使用普通的通用函数吗?使用WinMain或wWinMain时,它会影响函数中使用的参数类型吗?
例如,在创建空风炮的两个不同教程中,来自MSDN的一个教程指定如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace MainNameSpace
{
public class Lib
{
public void Result()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("192.168.1.101:8000/mytest");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader stream = new StreamReader(response.GetResponseStream());
string FinalResponse = stream.ReadToEnd();
Console.WriteLine(FinalResponse);
}
}
}
另一个tutorial指定如下:
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
...
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
注意在窗口标题中,一个是使用L"标题"而另一个使用" Title",所以我假设根据WinMain的类型,它也会影响参数类型,因为据我所知wWinMain用于Unicode而WinMain用于ANSI。
另一个相关的问题,如果我使用wWinMain或WinMain,然后我使用泛型函数,如MessageBox,它将根据WinMain类型解析为MessageBoxW或MessageBoxA?
由于
答案 0 :(得分:2)
WinMain()
和wWinMain()
不会影响程序是以ANSI还是Unicode运行;它决定了pCmdLine
参数的编码方式。 (您应该使用GetCommandLine()
,因为pCmdLine
不包含程序名称,可能包括其他内容,但我已经忘记了在MSDN上发现警告的位置......结合{即使在使用GetCommandLineW()
的程序中,{1}}和CommandLineToArgvW()
也会让您获得argc
/ argv
对。)
您的API是ANSI还是Unicode的决定是WinMain()
和_UNICODE
宏,但您可能最好明确使用UNICODE
- 后缀函数(但请保留)无论如何都定义了两个。)
您的窗口是否为Unicode的决定因素是您是否在窗口类上使用了W
/ RegisterClassW()
。
答案 1 :(得分:0)
/ENTRY (Entry-Point Symbol)
。如果没有设置直接/ENTRY:function
选项,则链接器使用默认值 - 例如,在wWinMainCRTStartup
定义时选择UNICODE
,/SUBSYSTEM:WINDOWS
时WinMainCRTStartup
和/SUBSYSTEM:WINDOWS
但UNICODE
1}}未定义。当wWinMainCRTStartup
在内部呼叫wWinMain
时,WinMainCRTStartup
会在内部致电WinMain
。因此,选择入口点取决于定义的UNICODE
或否,但仅限于/ENTRY:function
未直接设置。我们可以例如定义UNICODE
但设置/ENTRY:WinMainCRTStartup
并且需要实现" ANSI" WinMain
。并且根本不能使用CRT并将其设置为EP任何自己的功能
关于在代码中使用A
或W
版本的函数 - 比如MessageBox
这只是扩展为MessageBoxW
或MessageBoxA
依赖形式的宏{ {1}}在编译时定义。但是我们不能使用宏而是使用完整的函数名称。所以我们可以混合使用相同的代码UNICODE
和MessageBoxA
,CreateFileW
和CreateProcessA