基于WinMain和wWinMain的Unicode和ANSI函数和参数

时间:2016-11-20 19:00:06

标签: c++ winapi unicode ansi

当我们使用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?

由于

2 个答案:

答案 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)

与许多人一样,你对缺乏对基本事物的理解充满了困惑。首先,我们需要直接或间接设置我们的exe的/ENTRY (Entry-Point Symbol)。如果没有设置直接/ENTRY:function选项,则链接器使用默认值 - 例如,在wWinMainCRTStartup定义时选择UNICODE/SUBSYSTEM:WINDOWSWinMainCRTStartup/SUBSYSTEM:WINDOWSUNICODE 1}}未定义。当wWinMainCRTStartup在内部呼叫wWinMain时,WinMainCRTStartup会在内部致电WinMain。因此,选择入口点取决于定义的UNICODE或否,但仅限于/ENTRY:function未直接设置。我们可以例如定义UNICODE但设置/ENTRY:WinMainCRTStartup并且需要实现" ANSI" WinMain。并且根本不能使用CRT并将其设置为EP任何自己的功能

关于在代码中使用AW版本的函数 - 比如MessageBox这只是扩展为MessageBoxWMessageBoxA依赖形式的宏{ {1}}在编译时定义。但是我们不能使用宏而是使用完整的函数名称。所以我们可以混合使用相同的代码UNICODEMessageBoxACreateFileWCreateProcessA