VC 64位程序开发心的——获得程序位数和操作系统位数

   如今64位系统越来越流行了,对于软件开发人员来说,掌握64位开发技术将会有更好的发展空间。而且经过这几年的发展,64位开发工具也成熟了,例如Visual Studio 2010。
  关于如何配置64位平台,MSDN上有详细的介绍——
http://msdn.microsoft.com/zh-cn/library/9yb4317s.aspx
如何:针对 64 位平台配置 Visual C++ 项目

  在很多时候,我们希望能兼容老系统,于是配置了两个编译平台——Win32 和 x64。
  但光这样做还是不够的,因为老系统不支持某些新功能。所以我们需要在运行时动态动态判断。
  最常见的判断有两种——
1.判断程序位数:当前程序被编译到了哪个平台。
2.判操作系统位数:当前程序是运行在32位的操作系统上,还是64位的操作系统。

  对于第一种——判断程序位数,虽然也可以通过配置预处理符号,做编译时判定。但该方法稍微有点繁琐,而且在有些情况下不太适合——例如我想获得程序位数字符串,就必须用“#if”等语句写多行代码。
  对于第二种——判操作系统位数,那就只有在运行时判断了。

  代码如下——

#include <Windows.h>

#include <stdio.h>
#include <tchar.h>
#include <conio.h>

// 获取程序位数(被编译为多少位的代码)
int GetProgramBits()
{
	return sizeof(int*) * 8;
}

// 安全的取得真实系统信息
VOID SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo)
{
	if (NULL==lpSystemInfo)	return;
	typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
	LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;
	if (NULL != fnGetNativeSystemInfo)
	{
		fnGetNativeSystemInfo(lpSystemInfo);
	}
	else
	{
		GetSystemInfo(lpSystemInfo);
	}
}

// 获取操作系统位数
int GetSystemBits()
{
	SYSTEM_INFO si;
	SafeGetNativeSystemInfo(&si);
 	if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
		si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
	{
		return 64;
	}
	return 32;
}

int _tmain(int argc, _TCHAR* argv[])
{
	const int nBitCode = GetProgramBits();
	const int nBitSys = GetSystemBits();
	_tprintf(_T("I am a %dbit Program, run on %dbit System."), nBitCode, nBitSys);
	//
	_getch();
	return 0;
}


 

  在32位winXP上的运行效果——

  在64位win7上的运行效果——

 

  注:
1.GetNativeSystemInfo是Windows XP的新增API,用于取得真实系统信息。(32位程序运行在64位系统上时,GetSystemInfo返回的是经过WOW64修改后的信息)
2.IsWow64Process用于判断某进程是否运行在WOW64下。对于64位程序,Wow64Process参数会返回FALSE。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OPCUA是一种开放标准的通信协议,其在工业物联网领域得到了广泛应用。利用OPCUA开发上位机的HMI程序可以实现实时监控、数据采集与控制,具有简便、安全、高效等优点。 开发基于VC的OPCUA上位机HMI程序,可以采用第三方库提供的函数操作。其中,VC需要先添加SDK中的头文件和库文件,并在项目属性中设置编译选项。 编写程序时,需要进行以下步骤: 1. 初始化OPCUA环境,创建一个客户端对象。 2. 建立连接,连接到OPCUA服务器。 3. 浏览服务器上节点的属性和方法,找到需要访问的节点。 4. 读取或写入节点的值,通过OPCUA Client API进行操作。 5. 清空环境资源,关闭连接。 下面是一个简单的VC工程示例: ```c #include "opcua.h" int main() { // 初始化OPCUA环境 Opcua_Initialize(); // 创建客户端对象 Opcua_Client* client = Opcua_CreateClient(); // 建立连接 Opcua_Connect(client, "opc.tcp://localhost:4840"); // 浏览节点 Opcua_NodeId* nodeId = Opcua_CreateNodeId(OpcuaId_Server_NamespaceArray); Opcua_BrowseNodes(client, nodeId); // 读取节点值 Opcua_DataValue* value = Opcua_CreateDataValue(); Opcua_ReadValue(client, NULL, nodeId, value); // 写入节点值 Opcua_Variant* variant = Opcua_CreateVariant(); Opcua_WriteValue(client, NULL, nodeId, variant); // 关闭连接 Opcua_Disconnect(client); // 清空环境资源 Opcua_DeleteClient(client); Opcua_DeleteNodeId(nodeId); Opcua_DeleteDataValue(value); Opcua_DeleteVariant(variant); Opcua_Clear(); return 0; } ``` 值得注意的是,这个示例只是一个简单的演示,实际应用过程中需要根据具体应用搭建相应的节点和变量体系,以实现更复杂的数据采集、控制和监视等功能。 在此基础上,可以进一步开发相应的OPCUA上位机HMI程序,实现人机交互和数据可视化的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值