Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显式调用WINAPI ReadFile()_C++_Winapi_Readfile - Fatal编程技术网

C++ 显式调用WINAPI ReadFile()

C++ 显式调用WINAPI ReadFile(),c++,winapi,readfile,C++,Winapi,Readfile,我正在使用Garmin GPS设备,并试图通过USB从中提取与纬度、经度等相关的信息。我在SDK中工作,已经到了可以提取这些信息的地步,所以现在我正在将这些代码滚动到我工作的系统中 此代码被放置在一个类中:CGarminUSBEngine,它继承自CASCIIEngine 我使用代码从设备中提取此信息 ReadFile (gHandle, TheNewBuffer, MAX_BUFFER_SIZE, &theBytesReturned, NULL); 我的问题是cGar

我正在使用Garmin GPS设备,并试图通过USB从中提取与纬度、经度等相关的信息。我在SDK中工作,已经到了可以提取这些信息的地步,所以现在我正在将这些代码滚动到我工作的系统中

此代码被放置在一个类中:CGarminUSBEngine,它继承自CASCIIEngine

我使用代码从设备中提取此信息

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::等等。。。如此接近,但迄今为止。非常感谢你的澄清,效果非常好。