GetComputerNameEx()
昨晚看了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()的更多相关文章
- 英文不好也能快速"记忆" API
英文不好不要紧,把API函数导入打字练习类软件,即是练习打字速度,提高编程效率:也能短时间记忆API. 坚持每天打一遍,约2小时,连续打两周,会对API有很好的记忆,此方法是结合英文学习方法!以下是W ...
- windows server 2008 - 创建域和本机用户
/* * ===================================================================================== * Filenam ...
- 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 ...
- pywin32记录备忘
项目地址:http://sourceforge.net/projects/pywin32/ 文档地址:http://docs.activestate.com/activepython/2.7/pywi ...
- 系统信息的管理函数API
1.Windows系统信息 1.1获取系统版本: BOOL WINAPI GetVersionEx( __in_out LPOSVERSIONINFO lpVersionInfo ); lpVer ...
随机推荐
- mysql 原理 ~ 死锁问题
一 锁1 锁的定义 1 按照宏观角度 共享锁[S锁] 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...
- Django学习手册 - CURD组件
CURD CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD.作用是用于处理数据的基本原子操作. 它代表创建(Create).更新(Update).读取(Retriev ...
- Libevent源码分析系列【转】
转自:https://www.cnblogs.com/zxiner/p/6919021.html 1.使用libevent库 源码那么多,该怎么分析从哪分析呢?一个好的方法就是先用起来,会用了 ...
- Linux信号-信号集&信号屏蔽字&捕捉信号【转】
转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念 实际执行信号的处理 ...
- ARMCC和GCC编译ARM代码的软浮点和硬浮点问题 【转】
转自:http://houh-1984.blog.163.com/blog/static/31127834201211112129167/ 本文介绍了ARM代码编译时的软浮点(soft-float)和 ...
- 解决MySQL报错ERROR 2002 (HY000)【转】
今天在为新的业务线搭架数据库后,在启动的时候报错 root@qsbilldatahis-db01:/usr/local/mysql/bin# ./mysql ERROR 2002 (HY000): C ...
- ROS入门学习
ROS学习笔记 ROS入门网站; ROS入门书籍 ROS主要包含包括功能包.节点.话题.消息类型和服务; ROS功能包/软件包(Packages) ROS软件包是一组用于实现特定功能的相关文件的集合, ...
- $Django patch与put,视图组件,路由控制,响应器
1 patch与put(幂等?回顾) PATCH 与 PUT 属性上的一个重要区别还在于:PUT 是幂等的,而 PATCH 不是幂等的.幂等是一个数学和计算机学概念,在计算机范畴内表示一个操作执行任意 ...
- kafka manager安装配置和使用
kafka manager安装配置和使用 .安装yum源 curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintra ...
- node学习第一天:nvm使用
nvm是什么? 学习node,首先要安装node的环境,nvm是一款工具,使用这款工具可以很方便的下载所需版本的node文件以及npm,十分的方便. nvm下载: nvm下载链接 注:下载文件名为 n ...