昨晚看了MSDN提供的GetComputerNameEx function(参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724301),想试试这个函数,于是Ctrl + C、Ctrl + V,稍作修改,Build...

提示错误:error: '_countof' was not declared in this scope

代码如下(基于Code::Blocks):

IDE: Code::Blocks

操作系统:Windows 7 x64

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <stdio.h>
#include <tchar.h> int _tmain(void)
{
TCHAR buffer[] = TEXT("");
TCHAR szDescription[][] = { TEXT("NetBIOS"),
TEXT("DNS hostname"),
TEXT("DNS domain"),
TEXT("DNS fully-qualified"),
TEXT("Physical NetBIOS"),
TEXT("Physical DNS hostname"),
TEXT("Physical DNS domain"),
TEXT("Physical DNS fully-qualified") };
int cnf = ;
DWORD dwSize = sizeof(buffer); for (cnf = ; cnf < ComputerNameMax; cnf++)
{
if (!GetComputerNameEx((COMPUTER_NAME_FORMAT)cnf, buffer, &dwSize)) {
_tprintf(TEXT("GetComputerNameEx failed (%lu) \n"), GetLastError());
return ;
}
else {
_tprintf(TEXT("%s: %s \n"), szDescription[cnf], buffer);
} dwSize = _countof(buffer);
ZeroMemory(buffer, dwSize);
} return ;
}

之后便是各种折腾,始终找不到问题所在,后来太晚了,就睡了。。。


今早重新上网找,嘿!终于有些眉目了!

有网友说需要包含头文件stdlib.h,然后,我就包含啊,Build... 还是不行!

另有网友说,可能是因为IDE掺杂了不同的版本的库导致:http://bbs.csdn.net/topics/340124944

后来看到有网友把关于宏“_countof()”的定义给贴了出来:http://blog.csdn.net/shell2522/article/details/5790885,这里也有:http://blog.csdn.net/yahohi/article/details/8035743

于是,又把代码改了一下,Build... 嗯,这下终于是通过了!目前只能靠这个方法解决,改天换个IDE试试。

 #define _WIN32_WINNT 0x0500

 #include <windows.h>
#include <stdio.h>
#include <tchar.h> #if !defined(_countof)
#if !defined(__cplusplus)
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
#else
extern "C++"
{
template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
#define _countof(_Array) sizeof(*__countof_helper(_Array))
}
#endif
#endif int _tmain(void)
{
TCHAR buffer[] = TEXT("");
TCHAR szDescription[][] = { TEXT("NetBIOS"),
TEXT("DNS hostname"),
TEXT("DNS domain"),
TEXT("DNS fully-qualified"),
TEXT("Physical NetBIOS"),
TEXT("Physical DNS hostname"),
TEXT("Physical DNS domain"),
TEXT("Physical DNS fully-qualified") };
int cnf = ;
DWORD dwSize = sizeof(buffer); for (cnf = ; cnf < ComputerNameMax; cnf++)
{
if (!GetComputerNameEx((COMPUTER_NAME_FORMAT)cnf, buffer, &dwSize)) {
_tprintf(TEXT("GetComputerNameEx failed (%lu) \n"), GetLastError());
return ;
}
else {
_tprintf(TEXT("%s: %s \n"), szDescription[cnf], buffer);
} dwSize = _countof(buffer);
ZeroMemory(buffer, dwSize);
} return ;
}

有一些还是刚接触的,不懂,自己琢磨一下。

关于“TEXT()”的宏定义:

#ifdef UNICODE
/*
* __TEXT is a private macro whose specific use is to force the expansion of a
* macro passed as an argument to the macro TEXT. DO NOT use this
* macro within your programs. It's name and function could change without
* notice.
*/
#define __TEXT(q) L##q
#else
#define __TEXT(q) q
#endif
/*
* UNICODE a constant string when UNICODE is defined, else returns the string
* unmodified.
* The corresponding macros _TEXT() and _T() for mapping _UNICODE strings
* passed to C runtime functions are defined in mingw/tchar.h
*/
#define TEXT(q) __TEXT(q)

所以,语句:

TCHAR buffer[] = TEXT("");

经过预处理器处理之后,其实就是:

char buffer[] = "";

语句:

ZeroMemory(buffer, dwSize);

关于“ZeroMemory()”的宏定义:

#define ZeroMemory RtlZeroMemory
#define RtlZeroMemory(d,l) RtlFillMemory((d),(l),0)
#define RtlFillMemory(d,l,f) memset((d), (f), (l))

线索渐渐清晰了,“ZeroMemory()”最终是关联到函数“memset()”,实际上就是等效:

memset(((buffer)), (), ((dwSize)));

作用就是将buffer的第一个字节至第dwSize个字节的内容改为0。


关于“_countof()”,网友是这样说的:http://blog.csdn.net/yahohi/article/details/8035743

MSDN给出关于“_countof()”的参考:https://msdn.microsoft.com/en-us/library/ms175773.aspx

GetComputerNameEx()的更多相关文章

  1. 英文不好也能快速"记忆" API

    英文不好不要紧,把API函数导入打字练习类软件,即是练习打字速度,提高编程效率:也能短时间记忆API. 坚持每天打一遍,约2小时,连续打两周,会对API有很好的记忆,此方法是结合英文学习方法!以下是W ...

  2. windows server 2008 - 创建域和本机用户

    /* * ===================================================================================== * Filenam ...

  3. VC++获取计算机Hardware Information (CPU ID, MainBoard Info, Hard Disk Serial, System Information)

    转载:http://blog.csdn.net/yapingxin/article/details/50107799 转载:http://zhidao.baidu.com/link?url=A5K6N ...

  4. pywin32记录备忘

    项目地址:http://sourceforge.net/projects/pywin32/ 文档地址:http://docs.activestate.com/activepython/2.7/pywi ...

  5. 系统信息的管理函数API

    1.Windows系统信息 1.1获取系统版本:   BOOL WINAPI GetVersionEx( __in_out LPOSVERSIONINFO lpVersionInfo ); lpVer ...

随机推荐

  1. Spring4之IOC

    或第六讲前也是讲此知识. \[www.dev1234.com]一头扎进Spring4视频教程\一头扎进Spring4源码\[www.java1234.com]<一头扎进Spring4>第六 ...

  2. Maven多模块项目管理小结

    原文地址:http://blog.csdn.net/whuslei/article/details/7989102 题记 最近刚完成一个用Maven构建的Web项目,看了一些Maven方面的书,比如& ...

  3. UVA1660 电视网络 Cable TV Network

    题目地址:UVA1660 电视网络 Cable TV Network 枚举两个不直接连通的点 \(S\) 和 \(T\) ,求在剩余的 \(n-2\) 个节点中最少去掉多少个可以使 \(S\) 和 \ ...

  4. CF1100F Ivan and Burgers

    题目地址:CF1100F Ivan and Burgers 一道有难度的线性基题,看了题解才会做 预处理两个数组: \(p_{r,i}\) 表示满足下列条件的最大的 \(l\) :线性基第 \(i\) ...

  5. 20165231 2017-2018-2 《Java程序设计》第7周学习总结

    教材学习内容总结 第十一章 MySQL数据库管理系统,简称MySQL,是世界上最流行的开源数据库管理系统,其社区版(MySQL Community Edition)是最流行的免费下载的开源数据库管理系 ...

  6. MySQL报错总结

    错误一: MySQL从cmd使用命令“mysql -u root -p”启动报错,显示“不能连接到端口xxx”(实际端口为3306),这里的问题实际是由于我没有设置mysql开机自启动,所以解决方案就 ...

  7. 10 个 MySQL 经典错误【转】

    Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 mysql> show variables like '%max_connec ...

  8. HAProxy详解(二):HAProxy基础配置与应用实例

    一.HAProxy基础配置与应用实例: 1.快速安装HAProxy集群软件: HAProxy的官网: https://www.haproxy.org/#down下载HAProxy的源码包. 安装: [ ...

  9. Jetbrain系列软件配置文件同步

    https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-st ...

  10. 用ARX自定义实体

      本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h",&quo ...