社区
VC.NET
帖子详情
怎样把Variant转换到Float类型?
wxcnl1
2017-10-25 06:01:28
传入的数组saValues为10,20和30
for (long index = 0; index < count; index++)
{
VARIANT out;
SafeArrayGetElement(saValues, &index, &out);
。。。。
float value = V_R4(&out);
结果得到的值不正确。用out.fltVal好像也不对。所以
怎样把Variant转换到Float类型?
谢谢!
...全文
495
回复
打赏
收藏
怎样把Variant转换到Float类型?
传入的数组saValues为10,20和30 for (long index = 0; index < count; index++) { VARIANT out; SafeArrayGetElement(saValues, &index, &out); 。。。。 float value = V_R4(&out); 结果得到的值不正确。用out.fltVal好像也不对。所以 怎样把Variant转换到Float类型? 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
delphi-变体
类型
(
variant
)的介绍(流与变体
类型
的相互
转换
变体
类型
常用的函数
delphi-变体
类型
(
variant
)的介绍(流与变体
类型
的相互
转换
变体
类型
常用的函数
VC中各种不同数据
类型
的相互
转换
2(补充)
对VC中的各种不同数据
类型
进行
转换
(涉及数据
类型
:int,long,
float
,double,char username[],char temp[200], char *buf,CString,_
variant
_t,_bstr_t)
Visual C++ 常用数据
类型
转换
方法详解第1/2页
说明:本文纯粹是总结一下有关
类型
转换
的贴子, 本人并未对所有方法都做测试,仅仅是为了给大家一个参考。 读者层次:初学 int i = 100; long l = 2001;
float
f=300.2; double d=12345.119; char username[]=”程佩君”; char temp[200]; char *buf; CString str; _
variant
_t v1; _bstr_t v2; 一、其它数据
类型
转换
为字符串 短整型(int) itoa(i,temp,10);///将i
转换
为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); /
标准MFC WinSock ActiveX控件开发实例
主要介绍如何开发一个ActiveX控件,提供接口,与相应事件挂钩。文中涉及到
VARIANT
,SAFEARRAY,BSTR的详细使用方法。 另外还提供了WinSock的详细开发步骤,以及如何响应网络超时,网络断开的事件方法以及在VC,VB调用该控件的方法。 一、MFC ActiveX控件开发步骤(VC 6.0): New->Projects->MFC ActiveX ControlWizard,然后输入MFCWinSock工程名。如下图: 图一 创建工程 一路狂按Next,直至Finsh出现,再按下OK,如下图: 图二 创建完成 二、架设Socket环境: 首先在StdAfx.h文件中加入下面这句代码: #include
// MFC socket extensions 打开MFCWinSock.cpp文件,添加代码,看起来如下: //////////////////////////////////////////////////////////////////////////// // CMFCWinSockApp::InitInstance - DLL initialization BOOL CMFCWinSockApp::InitInstance() { BOOL bInit = COleControlModule::InitInstance(); if (bInit) { // TODO: Add your own module initialization code here. if (!AfxSocketInit()) { AfxMessageBox("无法初始化Socket,请检查!"); return FALSE; } WSADATA wsaData; WORD wVersion = MAKEWORD(1, 1);//设定为Winsock 1.1版 int errCode; errCode = WSAStartup(wVersion, &wsaData);//启动Socket服务 if (errCode) { AfxMessageBox("无法找到可以使用的 WSOCK32.DLL"); return FALSE; } } return bInit; } //////////////////////////////////////////////////////////////////////////// // CMFCWinSockApp::ExitInstance - DLL termination int CMFCWinSockApp::ExitInstance() { // TODO: Add your own module termination code here. WSACleanup();//结束网络服务 return COleControlModule::ExitInstance(); } 三,提供控件接口和事件 在MFCWinSockCtl.cpp加入如下代码: #ifndef WM_MYWINSOCK #define WM_MYWINSOCK WM_USER+1888 #endif View->ClassWizard->Automation->Add Method…如下图: 图三 创建接口 这个时候,我们为这个控件添加了一个Connect()的接口,出于通用性,安全性和扩展性的考虑,我们采用了
VARIANT
类型
的参数, 很多人可能都不太了解该
类型
,又或者有接触过,但被吓怕了,那么我们来看清它的本来面目: struct tag
VARIANT
{ union { struct __tag
VARIANT
{ VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { LONG lVal; BYTE bVal; SHORT iVal;
FLOAT
fltVal; DOUBLE dblVal;
VARIANT
_BOOL boolVal; _
VARIANT
_BOOL bool; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown __RPC_FAR *punkVal; IDispatch __RPC_FAR *pdispVal; SAFEARRAY __RPC_FAR *parray; BYTE __RPC_FAR *pbVal; SHORT __RPC_FAR *piVal; LONG __RPC_FAR *plVal;
FLOAT
__RPC_FAR *pfltVal; DOUBLE __RPC_FAR *pdblVal;
VARIANT
_BOOL __RPC_FAR *pboolVal; _
VARIANT
_BOOL __RPC_FAR *pbool; SCODE __RPC_FAR *pscode; CY __RPC_FAR *pcyVal; DATE __RPC_FAR *pdate; BSTR __RPC_FAR *pbstrVal; IUnknown __RPC_FAR *__RPC_FAR *ppunkVal; IDispatch __RPC_FAR *__RPC_FAR *ppdispVal; SAFEARRAY __RPC_FAR *__RPC_FAR *pparray;
VARIANT
__RPC_FAR *pvarVal; PVOID byref; CHAR cVal; USHORT uiVal; ULONG ulVal; INT intVal; UINT uintVal; DECIMAL __RPC_FAR *pdecVal; CHAR __RPC_FAR *pcVal; USHORT __RPC_FAR *puiVal; ULONG __RPC_FAR *pulVal; INT __RPC_FAR *pintVal; UINT __RPC_FAR *puintVal; struct __tagBRECORD { PVOID pvRecord; IRecordInfo __RPC_FAR *pRecInfo; } __
VARIANT
_NAME_4; } __
VARIANT
_NAME_3; } __
VARIANT
_NAME_2; DECIMAL decVal; } __
VARIANT
_NAME_1; }; 它先是一个结构体,里面有一个重要成员VARTYPE vt;vt即是指明当前的数据
类型
,比如整型或者字符型,当指明vt后, 后面看到各种变量
类型
包括在一个联合体当中,也就是说指明vt后,你只能使用对应的其中之一变量
类型
。看着这众多的各种不同
类型
变量集中在一起,确实让人吓了一跳,但细细看来,大多数变量跟我们平时的用法相似。值得一提的是SAFEARRAY __RPC_FAR *parray; 也许有很多人还没有接触过SAFEARRAY
类型
的变量,SAFEARRAY实际上也是一个结构,大家可以参考MSDN,我也将在后面介绍它的具体使用方法。 用同样的方法创建DisConnect()接口 创建两个事件,FireCloseWinsock()响应网络断开事件,FireRecvSockEvent()响应网络有数据到达的事件。创建方法如下图: 图四 创建事件 重载控件消息处理函数WindowProc(),在View->ClassWizard中打开类向导,在消息映射中找到WindowProc,如下图: 图五 重载WindowProc() 四、编写代码 编写
Variant
ToLong()
转换
函数,该函数代码如下: //
类型
转换
,将
VARIANT
类型
转换
成Long
类型
long CMFCWinSockCtrl::
Variant
ToLong(const
VARIANT
&var) { long r; switch(var.vt) { case VT_UI2://USHORT r = var.uiVal; break; case VT_UI4://ULONG r = var.ulVal; break; case VT_INT://INT r = var.intVal; break; case VT_UINT://UINT r = var.uintVal; break; case VT_I4://LONG r = var.lVal; break; case VT_UI1://BYTE r = var.bVal; break; case VT_I2://SHORT r = var.iVal; break; case VT_R4://
FLOAT
r = (long)var.fltVal; break; case VT_R8://DOUBLE r = (long)var.dblVal; break; default: r = -1;//无法
转换
该值 break; } return r; } 大家可以看到,该函数将最基本的若干中数据
类型
转换
成了long
类型
,但
VARIANT
决不是个简单的谱,我将在后面继续揭开它的神秘面纱. 编写我们刚才的接口Connect(),代码代码如下: 在MFCWinSockCtrl.h中加入 SOCKET OnlySock;//建立的唯一Socket,不允许重复建立多个 bool isOnlyConnect;//是否建立了连接 然后再编写Connect(),看起来如下: BOOL CMFCWinSockCtrl::Connect(const
VARIANT
FAR& RemoteHost, const
VARIANT
FAR& RemotePort) { // TODO: Add your dispatch handler code here if(isOnlyConnect)//该连接已建立,还没有断开 return FALSE; CString IPAddress; int Port;//
转换
成整型的端口 switch(RemoteHost.vt) { case VT_BSTR://字符串型 IPAddress = CString(RemoteHost.bstrVal); break; case VT_BYREF|VT_I1://CHAR * IPAddress.Format("%s",RemoteHost.pcVal);//RemoteHost.pbstrVal); break; default: IPAddress = ""; return FALSE; } Port =
Variant
ToLong(RemotePort);//我们编写的一个
VARIANT
转换
成long
类型
的函数 if(Port<=0) return FALSE; _TCHAR *ip = 0; struct hostent *host = 0; struct sockaddr_in addr; ULONG dotIP = inet_addr(IPAddress); OnlySock = socket(AF_INET, SOCK_STREAM, 0); // 判断是否为点IP地址格式 if (OnlySock == INVALID_SOCKET) { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; } memset(&addr, 0, sizeof(struct sockaddr_in)); // 设定 SOCKADDR_IN 结构的内容 // 如果通讯协议是选择IP Protocol,那此值固定为AF_INET // AF_INET 与 PF_INET 这两个常量值相同 addr.sin_family = AF_INET; addr.sin_port = htons(Port); addr.sin_addr.S_un.S_addr = dotIP; if (dotIP == INADDR_NONE) { host = gethostbyname(IPAddress); if (!host) { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; }; ip = inet_ntoa(*(struct in_addr*)(*host->h_addr_list)); addr.sin_addr.S_un.S_addr = inet_addr(ip); } //开始连线 if (connect(OnlySock, (LPSOCKADDR)&addr, sizeof(SOCKADDR))) { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; } int iError = WSAAsyncSelect(OnlySock, m_hWnd,WM_MYWINSOCK, FD_READ|FD_CLOSE); //只对网络断开和数据到达通知感兴趣 if(iError == SOCKET_ERROR)//无法绑定Winsock的事件通知 { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; } isOnlyConnect = true; return TRUE; } 有必要提一下WSAAsyncSelect(),这里接收网络数据到达和断开的两个消息,我们收到WM_MYWINSOCK消息时将处理该消息并作为事件传送给调用者. 第二个参数,窗口句柄,我们传送了m_hWnd,这是因为MFC ActiveX也属于一个窗口,并且是可见的,因此可以成功。 编写WindowProc(),代码看起来如下: LRESULT CMFCWinSockCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch(message) { case WM_MYWINSOCK://响应自定义的消息 switch(WSAGETSELECTEVENT(lParam)) { case FD_READ://有新数据到达 FireRecvSockEvent(); break; case FD_CLOSE://对方已断掉当前连接 FireCloseWinsock(); break; } break; default: break; } return COleControl::WindowProc(message, wParam, lParam); } 本部分结束语: 好了,现在一个可以运行的控件已经完成,里面提供有Connect()和DisConnect()接口,和RecvSockEvent()及CloseWinsock()事件。以及WinSock的使用方法。 在下一部分(高级篇)将讲解两个重要接口SendData()和GetData(),下期内容如下: long SendData(const
VARIANT
FAR& Data, const
VARIANT
FAR& DataType,const
VARIANT
FAR& DataLength, const
VARIANT
FAR& TimeOut) long GetData(
VARIANT
FAR* Data, const
VARIANT
FAR& DataType, const
VARIANT
FAR& DataMaxLength, const
VARIANT
FAR& TimeOut)
VARIANT
和SAFEARRAY的复杂用法。 控件开发出来后在VC和VB环境下的使用方法。 声明: 部分资料来源于网络,本文所用的所有源代码仅供非商业用途,并请保留原版权,否则后果自负! 欢迎大家拍砖,或指正不足的地方,一起探导更好的方法。 欢迎访问www.59186618.com,感谢您的支持!
TypeConversionModel
该资源包含了常见的各种
类型
之间的互相
转换
,包括CString,int ,
float
,BSTR,CTime,COleDateTime,
VARIANT
等常用的
类型
,是我在之间写的一个模型类,我感觉值得大家借鉴和参考,所以传上来,希望对大家有用!
VC.NET
7,540
社区成员
27,673
社区内容
发帖
与我相关
我的任务
VC.NET
.NET技术 VC.NET
复制链接
扫一扫
分享
社区描述
.NET技术 VC.NET
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章