关于VC++的Winmain函数(WINAPI是啥?)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于VC++的Winmain函数(WINAPI是啥?)相关的知识,希望对你有一定的参考价值。

学过C++,定义main函数时用 int main() 但VC++的Winmain函数则为int WINAPI Winmain() int 是返回值类型,那么WINAPI是什么?

参考技术A 其实那是程序进入点:
正如在C程序中的进入点是函数main一样,Windows程序的进入点是WinMain,总是像这样出现:
int
WINAPI
WinMain
(
HINSTANCE
hInstance,HINSTANCE
hPrevInstance,
LPSTR
szCmdLine,int
iCmdShow)
它在WINBASE.H中声明如下:
int
WINAPI
WinMain(
HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nShowCmd
);
WinMain函数声明为返回一个int值。WINAPI标识符在WINDEF.H定义,语句如下:
#define
WINAPI
__stdcall
该语句指定了一个呼叫约定,包括如何生产机械码以在堆栈中放置函数呼叫的参数。许多Windows函数呼叫声明为WINAPI。
WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数。在Windows的早期版本中,当同时运行同一程序多次时,您便创建了该程序的「多个执行实体(multiple
instances)」。同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源)。程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。
在32位Windows版本中,该概念已被抛弃。传给WinMain的第二个参数总是NULL(定义为0)。
WinMain的第三个参数是用于执行程序的命令列。某些Windows应用程序利用它在程序启动时将文件加载内存。WinMain的第四个参数指出程序最初显示的方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中

VC ++ WINAPI窗体:找不到标识符(C3861错误)

我正在研究从一些旧的Delphi代码到VC ++ 2013的端口,我遇到了一个错误,我觉得应该是一个简单的修复,但不能为我的生活弄清楚......

问题是:我在本地文件Utils.h中有许多常用的实用程序函数,我将其作为Windows窗体的一部分进行部署。此标头中的大多数(90%)函数正常工作。但是,GetMsg(...)会抛出C3861 Identifier not found错误...

Utils.h(片段):GetMsg在底部声明

#pragma once

/*------------------------------------------------------------------------*
  Includes:
*------------------------------------------------------------------------*/

using namespace std;

/*------------------------------------------------------------------------*
  Constants:
*------------------------------------------------------------------------*/
#define GET_MSG_TIMEOUT 2


/*------------------------------------------------------------------------*
  Typedefs, Structs, Enums:
*------------------------------------------------------------------------*/
typedef union
{
   unsigned long  ui32;
   unsigned char  ui8[4];
} UI32_UI8;

typedef union
{
   unsigned short ui16;
   unsigned char  ui8[2];
} UI16_UI8;

typedef union
{
   float f;
   unsigned char  ui8[4];
} F_UI8;

typedef struct
{
   string sName;
   string sVersion;
   string sCompany;
   string sCopyright;
} PRODUCT_INFORMATION;


/*------------------------------------------------------------------------*
  Prototypes:
*------------------------------------------------------------------------*/
unsigned short SwapShort(unsigned short aShort);
float SwapFloat(float aFloat);
unsigned long SwapLong(unsigned long aLong);
unsigned int ReadLine(unsigned char *msgBuf, SerialPort^ Hdl, bool ReturnLF);
void  __stdcall FillTheBuffer(char *buf, String sss, int length);
string  __stdcall FillTheString(string sss, int length);
unsigned int __stdcall GetMsg(SerialPort^ Hdl, unsigned char *msgBuf);

Utils.cpp中的GetMsg定义:

//---------------------------------------------------------
unsigned int __stdcall GetMsg(SerialPort^ Hdl, unsigned char *msgBuf)
{
  ...
}

最后,在表单文件中使用GetMsg:

#include "Utils.h"

...

void MainForm::UploadButton_Click
     (System::Object^ object, System::EventArgs^ e) 
{

...

SwapShort(1); //Works fine, also declared in Utils.h
GetMsg(spCom, inBuf); //C3861 ERROR

...

}

其中spCom是在Windows窗体中包含,配置和打开的(SerialPort ^)。 inBuf是一个简单的字符数组(char *)来缓冲输入。我已经尝试重命名该函数,认为其他文件中可能存在无意的冲突/过载,但无济于事。

有什么建议?提前致谢

答案

解决了问题 - 事实证明我需要在函数定义中更明确。将声明更改为读取

GetMsg(System::IO::Ports::SerialPort^ Hdl, unsigned char *msgBuf)

消除了C3861错误。似乎缺少声明中的特定命名空间传递了Intellisense但使编译器感到困惑,导致它无法确定哪个原型与函数调用一起使用。

以上是关于关于VC++的Winmain函数(WINAPI是啥?)的主要内容,如果未能解决你的问题,请参考以下文章

WinAPI WinMain, CreateMutex, ShellExecute三个函数

VC中MFC从哪里开始运行,MFC怎么调试

VC中MFC从哪里开始运行,MFC怎么调试,很急呀

哪一位VC的高手能告诉我为啥WinMain函数中无法使用Cout或Cin?不胜感激!

为啥我在一个VC++程序中找不到主函数main啊?

关于 ReadFile() WinAPI,GetLastError 抛出错误 183。在这种情况下,“ERROR_ALREADY_EXISTS”是啥意思?