C++ 显式调用WINAPI ReadFile()
我正在使用Garmin GPS设备,并试图通过USB从中提取与纬度、经度等相关的信息。我在SDK中工作,已经到了可以提取这些信息的地步,所以现在我正在将这些代码滚动到我工作的系统中 此代码被放置在一个类中:CGarminUSBEngine,它继承自CASCIIEngine 我使用代码从设备中提取此信息C++ 显式调用WINAPI ReadFile(),c++,winapi,readfile,C++,Winapi,Readfile,我正在使用Garmin GPS设备,并试图通过USB从中提取与纬度、经度等相关的信息。我在SDK中工作,已经到了可以提取这些信息的地步,所以现在我正在将这些代码滚动到我工作的系统中 此代码被放置在一个类中:CGarminUSBEngine,它继承自CASCIIEngine 我使用代码从设备中提取此信息 ReadFile (gHandle, TheNewBuffer, MAX_BUFFER_SIZE, &theBytesReturned, NULL); 我的问题是cGar
ReadFile (gHandle,
TheNewBuffer,
MAX_BUFFER_SIZE,
&theBytesReturned,
NULL);
我的问题是cGarminus Bengine继承的CASCIIEngine具有以下功能
BOOL ReadFile(void)
当我试图调用带有5个参数的ReadFile来从USB设备读取数据时,我得到了一个编译器错误:“CASCIIEngine::ReadFile”:函数不接受5个参数
我还没有弄清楚如何显式调用这个ReadFile函数的WINAPI版本,甚至还没有弄清楚为什么需要这样做。在我看来,编译器应该知道ReadFile重载了,我试图调用WINAPI版本,而不是CASCIIEngine版本
主要我想知道如何显式调用WINAPI版本,其次我想知道为什么需要这样做。也许我只是错过了一件简单的事情,这会令人沮丧。我感谢任何帮助 出现错误是因为编译器正在解析对CASCIIEngine::Readfile的调用,而不是Windows API†提供的全局Readfile函数 显然,参数的数量不匹配,因此编译器会抱怨 要告诉编译器引用全局ReadFile函数,请使用::scope解析运算符
::ReadFile (gHandle, TheNewBuffer, MAX_BUFFER_SIZE, &theBytesReturned, NULL);
// ^^---- Note `::`
<> P> >在C++标准中详细阐述了确定哪一个函数被解析的确切规则。与贵方情况相关的条款如下:
3.4.1非限定名称查找[basic.lookup.unqual]
一,。在3.4.1中列出的所有情况下,搜索范围以查找
按各类别所列顺序申报;
一旦找到名称的声明,名称查找就会结束。
如果未找到声明,则程序的格式不正确
八,。类的成员函数9.3定义中使用的名称
函数的声明器id后面的X应在一个
以下方法之一:
在其所在的块或封闭空间中使用之前
第6.3条,或
应为X类成员,或为
X 10.2,或
如果X是Y 9.7类的嵌套类,则应为
Y、 或应为该查找适用的Y基类的成员
依次是Y的封闭类,从最内层开始
封闭类,或
如果X是本地类9.8或是本地类的嵌套类
类,在包含
X类的定义,或
如果X是命名空间N的成员,或者是
类,该类是N的成员,或者是本地类或嵌套类
在作为N的成员的函数的局部类中,在
成员函数定义,位于命名空间N或其中一个命名空间N中
封闭名称空间。
9.3.1非静态成员函数[class.mfct.Nonstatic]
二,。当id表达式5.1不是类成员的一部分时
access语法5.2.5,不用于形成指向成员5.3.1的指针
用于类X或类X的非静态成员函数体中
用于X类构造函数的mem初始值设定项,如果
名称查找3.4.1将id表达式中的名称解析为
类X或基类X的非静态非类型成员
id表达式转换为类成员访问表达式
5.2.5使用*这9.3.2作为左边的后缀表达式
是的。操作人员然后,成员名称指的是
为其调用函数的对象
根据3.4.1/1和3.4.1/8,CASCIIEngine类中的ReadFile声明在第一个第二个项目符号之前找到,在全局命名空间中的ReadFile最后一个项目符号之前找到,因此名称查找解析为成员函数
这意味着您在类中对ReadFile的调用实际上被解析为:
(*this).ReadFile(gHandle, TheNewBuffer, MAX_BUFFER_SIZE,
&theBytesReturned, NULL); // Per 9.3.1/2
所以全局函数甚至没有考虑重载解析,因为它不是一个成员函数
以上述方式使用::scope resolution运算符时,它成为引用全局名称空间中名称的限定名称,因此上述规则不适用。出现错误是因为编译器正在解析对CASCIIEngine::Readfile的调用,而不是Windows API†提供的全局Readfile函数 显然,参数的数量不匹配,因此编译器会抱怨 要告诉编译器引用全局ReadFile函数,请使用::scope解析运算符
::ReadFile (gHandle, TheNewBuffer, MAX_BUFFER_SIZE, &theBytesReturned, NULL);
// ^^---- Note `::`
<> P> >在C++标准中详细阐述了确定哪一个函数被解析的确切规则。相关cl
对你的情况的原因如下:
3.4.1非限定名称查找[basic.lookup.unqual]
一,。在3.4.1中列出的所有情况下,搜索范围以查找
按各类别所列顺序申报;
一旦找到名称的声明,名称查找就会结束。
如果未找到声明,则程序的格式不正确
八,。类的成员函数9.3定义中使用的名称
函数的声明器id后面的X应在一个
以下方法之一:
在其所在的块或封闭空间中使用之前
第6.3条,或
应为X类成员,或为
X 10.2,或
如果X是Y 9.7类的嵌套类,则应为
Y、 或应为该查找适用的Y基类的成员
依次是Y的封闭类,从最内层开始
封闭类,或
如果X是本地类9.8或是本地类的嵌套类
类,在包含
X类的定义,或
如果X是命名空间N的成员,或者是
类,该类是N的成员,或者是本地类或嵌套类
在作为N的成员的函数的局部类中,在
成员函数定义,位于命名空间N或其中一个命名空间N中
封闭名称空间。
9.3.1非静态成员函数[class.mfct.Nonstatic]
二,。当id表达式5.1不是类成员的一部分时
access语法5.2.5,不用于形成指向成员5.3.1的指针
用于类X或类X的非静态成员函数体中
用于X类构造函数的mem初始值设定项,如果
名称查找3.4.1将id表达式中的名称解析为
类X或基类X的非静态非类型成员
id表达式转换为类成员访问表达式
5.2.5使用*这9.3.2作为左边的后缀表达式
是的。操作人员然后,成员名称指的是
为其调用函数的对象
根据3.4.1/1和3.4.1/8,CASCIIEngine类中的ReadFile声明在第一个第二个项目符号之前找到,在全局命名空间中的ReadFile最后一个项目符号之前找到,因此名称查找解析为成员函数
这意味着您在类中对ReadFile的调用实际上被解析为:
(*this).ReadFile(gHandle, TheNewBuffer, MAX_BUFFER_SIZE,
&theBytesReturned, NULL); // Per 9.3.1/2
所以全局函数甚至没有考虑重载解析,因为它不是一个成员函数
当您以上述方式使用::scope resolution运算符时,它将成为引用全局命名空间中名称的限定名称,因此上述规则不适用。天哪。我知道这会是非常简单的事情,但是我忘了我的基本C++。我试过uuu super::WINAPI::等等。。。如此接近,但迄今为止。非常感谢你的澄清,效果很好。我的天啊。我知道这会是非常简单的事情,但是我忘了我的基本C++。我试过uuu super::WINAPI::等等。。。如此接近,但迄今为止。非常感谢你的澄清,效果非常好。