再问VC基础问题,抓狂ing……API调用无效……
这样子一个简单程序,只是读当前计算机的DNS名,但,GetComputerNameEx调用出错……
// System.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
DWORD BufferLen = 1024;
LPCTSTR Buffer = new char[1024];
int _tmain(int argc, _TCHAR* argv[])
{
if (!GetComputerNameEx(2, Buffer, & BufferLen)){
return 1;}
std::cout<<Buffer;
system("PAUSE");
return 0;
}
e:\Projects\sysinfo\System\System.cpp(15): error C3861: “GetComputerNameEx”: 即使使用参数相关的查找,也未找到标识符
问题点数:300、回复次数:13Top
1 楼ifengfeng(fengfeng)回复于 2003-11-04 18:21:33 得分 5
char buffer[255];
DWORD bufferLen = 255;
GetComputerName(buffer, &bufferLen);
AfxMessageBox(buffer);Top
2 楼ljzcom()回复于 2003-11-04 18:25:23 得分 0
UP
Top
3 楼jiangsheng(蒋晟.Net[MVP])回复于 2003-11-04 18:27:24 得分 90
GetComputerNameEx是NT5(Win2000)以上才支持的,所以你要定义WIN_NT为5或者更高的值
Top
4 楼mfc168(子非鱼)回复于 2003-11-04 18:29:54 得分 5
agree jiangsheng(蒋晟.Net)Top
5 楼NowCan(城市浪人)回复于 2003-11-04 19:06:36 得分 90
#define WINNT 0x0500Top
6 楼bluebohe(薄荷)回复于 2003-11-04 19:16:12 得分 5
这个函数应该需要新的sdk库,在VC的头文件目录中是找不到这个函数的,就像前几天碰到的一个关于线程池的函数
.net框架里面VC7的winbase.h里面有定义Top
7 楼sxxny(轻云(Srj))回复于 2003-11-04 19:36:02 得分 5
自己在前面声明一下
BOOL GetComputerNameEx(
COMPUTER_NAME_FORMAT NameType, // name type
LPTSTR lpBuffer, // name buffer
LPDWORD lpnSize // size of name buffer
);
然后把Kernel32.lib包含进你的工程.Top
8 楼ccat(智拙)回复于 2003-11-05 03:20:32 得分 0
ifengfeng:我不需要GetComputerName(),因为我必须要计算机的DNS名。当然,有一个变通,如果有什么办法可以直接得到当前计算机所处的域就好啦。
其他各位:各们的办法都试过了,还是老毛病,找不到这个函数……
其实在IDLE里直接查找声明就找到啦,不知道为什么编译器就是不认。Top
9 楼ccat(智拙)回复于 2003-11-05 03:23:05 得分 0
对了,我用的VC7.1,还有就是查过编译器指令了,编译时包含的库里有Kernel32.libTop
10 楼shines(郭子)回复于 2003-11-05 04:11:01 得分 90
#include <Winbase.h> //记得定义
DWORD BufferLen = 1024;
TCHAR Buffer[1024];
//函数声明
typedef enum _COMPUTER_NAME_FORMAT {
ComputerNameNetBIOS,
ComputerNameDnsHostname,
ComputerNameDnsDomain,
ComputerNameDnsFullyQualified,
ComputerNamePhysicalNetBIOS,
ComputerNamePhysicalDnsHostname,
ComputerNamePhysicalDnsDomain,
ComputerNamePhysicalDnsFullyQualified,
ComputerNameMax
} COMPUTER_NAME_FORMAT ;
#ifdef __cplusplus
extern "C" {
#endif
/*
BOOL GetComputerNameEx(
COMPUTER_NAME_FORMAT NameType, // name type
LPTSTR lpBuffer, // name buffer
LPDWORD lpnSize // size of name buffer
);
*/
WINBASEAPI
BOOL
WINAPI
GetComputerNameExA (
COMPUTER_NAME_FORMAT NameType, // name type
LPTSTR lpBuffer, // name buffer
LPDWORD lpnSize // size of name buffer
);
WINBASEAPI
BOOL
WINAPI
GetComputerNameExW (
COMPUTER_NAME_FORMAT NameType, // name type
LPTSTR lpBuffer, // name buffer
LPDWORD lpnSize // size of name buffer
);
#ifdef UNICODE
#define GetComputerNameEx GetComputerNameExW
#else
#define GetComputerNameEx GetComputerNameExA
#endif // !UNICODE
#ifdef __cplusplus
}
#endif
//调用的时候
COMPUTER_NAME_FORMAT NameType = ComputerNameDnsHostname;
if (!GetComputerNameEx(NameType, Buffer, &BufferLen))
{
return 1;
}Top
11 楼ccat(智拙)回复于 2003-11-05 04:44:06 得分 0
搞定了,在Windows.h和Winbase.h的引用前面加上
#define _WIN32_WINNT 0x0500
宏就可以了
#define _WIN32_WINNT 0x0500
#include <Windows.h>
#include <Winbase.h>
#include "stdafx.h"
DWORD BufferLen = 1024;
LPSTR Buffer = new char[1024];
int _tmain(int argc, _TCHAR* argv[])
{
if (!GetComputerNameEx(ComputerNameDnsDomain, Buffer, &BufferLen))
{
return 1;
}
cout<<Buffer;
system("PAUSE");
return 0;
}
谢谢郭子这么晚还陪我调程序,老规矩,大家同喜,过一两天散分
下面大家讨论一下怎么在Windows 2000以前的计算机上得到域名信息好吗?谢谢!Top
12 楼duyhui(一天到晚游泳的鱼)回复于 2003-11-05 09:05:25 得分 0
学习!Top
13 楼yintongshun(左岸思雨)回复于 2003-11-05 09:16:55 得分 10
我给你说的地址吧:http://www.longen.org/SRC.htm在下面源代码部分有个:DNS的实现 例子,分两部分,很不错。Top




