常用數據與VARIANT之間的轉換---從網上整理

来源:http://www.cnblogs.com/yuanpan666/archive/2016/05/29/5539644.html
-Advertisement-
Play Games

實現文件 ...


//頭文件
1
#pragma once 2 class VariantConvert 3 { 4 public: 5 VariantConvert(void); 6 ~VariantConvert(void); 7 8 public: 9 void short2Variant(short sData,VARIANT &va); 10 //VARIANT short2Var(shortsData); 11 void long2Variant(long lData,VARIANT& va); 12 void float2Variant(float fData, VARIANT& va); 13 void double2Variant(double dData,VARIANT &va); 14 void unChar2Variant(unsigned char chData,VARIANT &va); 15 void arrayDouble2Variant(double *pArray,int iDim1Num,int iDim2Num,VARIANT &vaArray); 16 void arrayDouble2Variant(double *pArray,int iDimlength,VARIANT &vaArray); 17 void arraylong2Variant(long *pArray,int iDim1Num,int iDim2Num,VARIANT& vaArray); 18 void arraylong2Variant(long *pArray,int iDimlength,VARIANT &vaArray); 19 //void arrayunChar2Variant(byte *pArray,int iDim1Num,int iDim2Num,VARIANT &vaArray ); 20 void arrayunChar2Variant(byte *pArray,int iDimlength,VARIANT &vaArray); 21 public: 22 //void Variant2Data(VARIANT vaData, void&Data); 23 bool Variant2short(VARIANT vaData, short &sData); 24 bool Variant2long(VARIANT vaData, long & lData); 25 bool Variant2float(VARIANT vaData,float& fData); 26 bool Variant2double(VARIANT vaData,double & dData); 27 void Variant2Array(VARIANT vaArray,UINT &iDim,long&iDim1Num,long &iDim2Num,LPVOID *pData); 28 void Variant2Array(VARIANT vaArray,UINT &nDim,long&lDimLenght,VOID** pData); 29 };

  實現文件

#include "StdAfx.h"
#include "VariantConvert.h"


VariantConvert::VariantConvert(void)
{
}


VariantConvert::~VariantConvert(void)
{
}
void VariantConvert::short2Variant(short sData,VARIANT& va)
{
	va.vt=VT_I2;
	va.iVal = sData;
}

void VariantConvert:: long2Variant(long lData,VARIANT& va)
{
	va.vt = VT_I4;
	va.lVal = lData;
}

void VariantConvert::float2Variant(float fData,VARIANT& va)
{
	va.vt = VT_R4;
	va.fltVal = fData;
}

void VariantConvert::double2Variant(double dData,VARIANT& va)
{
	va.vt = VT_R8;
	va.dblVal = dData;
}

void VariantConvert::unChar2Variant(unsigned char chData,VARIANT& va)
{
	va.vt = VT_UI1;
	va.bVal = chData;
}

void VariantConvert::arrayDouble2Variant(double *pArray,int iDim,int iDim1Num,int iDim2Num,VARIANT&vaArray)	
{
	
	SAFEARRAY *psa;
	SAFEARRAYBOUND rgsabound[2];// 二維需要定義兩個元素
	rgsabound[0].lLbound =0; // 一維的下界(下界就是下標的最小值)
	rgsabound[0].cElements=iDim1Num; // 一維的元素的個數
	rgsabound[1].lLbound =0; // 二維的下界
	rgsabound[1].cElements =iDim2Num; // 二維的元素的個數
	long lIndex[2]; // 定義索引
	psa = SafeArrayCreate(VT_R8,2, rgsabound); // 按照二維數組分配空間
	for ( long k = 0; k< iDim1Num; k++)
	{
		lIndex[0] =k; 
			for (long num = 0; num < iDim2Num;num++)
			{ 
				lIndex[1] =num; 
				SafeArrayPutElement (psa, lIndex,&pArray[k*iDim2Num+num]); //lIndex作為SAFEARRAY中的索引。 
			}
	}

	vaArray.vt =VT_ARRAY|VT_R8; // 類型
	vaArray.parray =psa; // 賦值

}


// One dimension Convert
void VariantConvert::arrayDouble2Variant(double *pArray,int iDimlength,VARIANT &vaArray)
{
	SAFEARRAY *psa;
	SAFEARRAYBOUND rgsabound[1];
	rgsabound[0].lLbound=0;
	rgsabound[0].cElements=iDimlength;
	psa = SafeArrayCreate(VT_R8,1,rgsabound);
	long lIndex[1];
	for (int k=0; k < iDimlength; k++)
	{
		lIndex[0]=k;
		SafeArrayPutElement(psa,lIndex,&pArray[k]);
	}
	vaArray.vt = VT_ARRAY|VT_R8;
	vaArray.parray= psa;
}



void VariantConvert::arraylong2Variant(long *pArray,int iDim1Num,int iDim2Num,VARIANT& vaArray)
{
	SAFEARRAY *psa;
	SAFEARRAYBOUND rgsabound[2]; // 二維需要定義兩個元素
	rgsabound[0].lLbound =0; // 一維的下界
	rgsabound[0].cElements=iDim1Num; // 一維的元素的個數
	rgsabound[1].lLbound =0; // 二維的下界
	rgsabound[1].cElements =iDim2Num; // 二維的元素的個數
	long lIndex[2]; // 定義索引
	psa = SafeArrayCreate(VT_I4, 2, rgsabound); // 按照二維數組分配空間
	for ( long k = 0; k < iDim1Num; k++){
		lIndex[0] =k; 
			for (long num = 0; num < iDim2Num;num++ )
			{ 
				lIndex[1] =num; 
				SafeArrayPutElement (psa, lIndex,&pArray[k*iDim2Num+num]); //lIndex作為SAFEARRAY中的索引。 
			}
	}
	vaArray.vt = VT_ARRAY|VT_I4; 
	vaArray.parray = psa; 
}



void VariantConvert::arraylong2Variant(long *pArray,int iDimlength,VARIANT &vaArray)
{
	SAFEARRAY *psa;
	SAFEARRAYBOUND rgsabound[1];
	rgsabound[0].lLbound=0;
	rgsabound[0].cElements=iDimlength;
	psa = SafeArrayCreate(VT_I4,1,rgsabound);
	long lIndex[1];
	for (int k=0; k < iDimlength; k++)
	{
		lIndex[0]=k;
		SafeArrayPutElement(psa,lIndex,&pArray[k]);
	}
	vaArray.vt = VT_ARRAY|VT_I4;
	vaArray.parray= psa;
}
//
//
//
void VariantConvert::arrayunChar2Variant(byte *pArray,int iDim1Num,int iDim2Num,VARIANT& vaArray)
{
	SAFEARRAY *psa;
	SAFEARRAYBOUND rgsabound[2]; // 二維需要定義兩個元素
	rgsabound[0].lLbound =0; // 一維的下界
	rgsabound[0].cElements=iDim1Num; // 一維的元素的個數
	rgsabound[1].lLbound =0; // 二維的下界
	rgsabound[1].cElements =iDim2Num; // 二維的元素的個數
	long lIndex[2]; // 定義索引
	psa = SafeArrayCreate(VT_UI1, 2, rgsabound); // 按照二維數組分配空間
	for ( long k = 0; k < iDim1Num; k++)
	{
		lIndex[0] =k;
		for (long num = 0; num < iDim2Num;num++)
		{ 
			lIndex[1] =num; 
			SafeArrayPutElement (psa, lIndex,&pArray[k*iDim2Num+num]); //lIndex作為SAFEARRAY中的索引。 
		}
	}
	vaArray.vt =VT_ARRAY|VT_UI1; //vaArray為安全數組類型,每個元素為unsigned char 類型
	vaArray.parray =psa; 
}
//
//
//
void VariantConvert::arrayunChar2Variant(byte *pArray,int iDimlength,VARIANT &vaArray)
{
	SAFEARRAY *psa;
	SAFEARRAYBOUND rgsabound[1];
	rgsabound[0].lLbound=0;
	rgsabound[0].cElements=iDimlength;
	psa = SafeArrayCreate(VT_UI1,1,rgsabound);
	long lIndex[1];
	for (int k=0; k < iDimlength; k++)
	{
		lIndex[0]=k;
		SafeArrayPutElement(psa,lIndex,&pArray[k]);
	}
	vaArray.vt = VT_ARRAY|VT_UI1;
	vaArray.parray= psa;
}
////////////////////////////////////////////////////////////////////////////
//
//
//
// void VariantConvert::Variant2Data(VARIANT vaData, void& Data)
// {
// switch(vaData.vt)
// {
//   case VT_I2:
//   Data =vaData.iVal;
//  break;
//   case VT_I4:
//   Data =vaData.lVal;
//  break;
//   case VT_R4:
//   Data =vaData.fltVal;
//  break;
//   case VT_R8:
//   Data =vaData.dblVal;
//  break;
//   case VT_UI1:
//   Data =vaData.bVal;
//  break;
//
// }
//}
//
//
//
bool VariantConvert::Variant2short(VARIANT vaData, short& sData)
{
	if (vaData.vt == VT_I2)
	{
		sData = vaData.iVal;
		return true;
	}
	else
	{
		return false;
	}
}
//
//
//
bool VariantConvert::Variant2long(VARIANT vaData, long& lData)
{
	if (vaData.vt == VT_I4)
	{
		lData = vaData.iVal;
		return true;
	}
	else
	{
		return false;
	}
}
//
//
//
bool VariantConvert::Variant2float(VARIANT vaData,float& fData)
{
	if (vaData.vt == VT_R4)
	{
		fData = vaData.iVal;
		return true;
	}
	else
	{
		return false;
	}
}
//
//
//
bool VariantConvert::Variant2double(VARIANT vaData,double& dData)
{
	if (vaData.vt == VT_R4)
	{
		dData = vaData.iVal;
		return true;
	}
	else
	{
		return false;
	}
}
//
//
//
void VariantConvert::Variant2Array(VARIANT vaArray,UINT& iDim,long& iDim1Num,long& iDim2Num, LPVOID *pData)
{
	//   //獲得維數 
	//UINT iDim =SafeArrayGetDim(vaStartMark.parray); 
	iDim = SafeArrayGetDim(vaArray.parray);
	if (iDim != 2)
	{
		return;
	}
	//   //獲得元素大小,這個沒什麼用 
	UINT uEleSize = SafeArrayGetElemsize(vaArray.parray );

	// 獲得一維的下界和上界 
	long nDim1UBound; 
	long nDim1LBound; 
	SafeArrayGetUBound( vaArray.parray, 1, &nDim1UBound); 
	SafeArrayGetLBound( vaArray.parray, 1, &nDim1LBound);
	//   //獲得二維的下界和上界 
	long nDim2UBound; 
	long nDim2LBound; 
	SafeArrayGetUBound( vaArray.parray, 2, &nDim2UBound); 
	SafeArrayGetLBound( vaArray.parray, 2, &nDim2LBound);
	//  
	//   //計算元素個數,分配空間使用 
	//long nDim1Count = nDim1UBound - nDim1LBound +1; 
	//long nDim2Count = nDim2UBound - nDim2LBound + 1;
	iDim1Num = nDim1UBound - nDim1LBound + 1;
	iDim2Num = nDim2UBound - nDim2LBound +1;
	
	int x = 0; 
	int y = 0; 
	long lIndex[2];
	for ( long nDim1 = nDim1LBound; nDim1 < nDim1UBound; nDim1++)
	{
		lIndex[0] =nDim1; 
			y =0; 
		for ( long nDim2 =nDim2LBound; nDim2 < nDim2UBound; nDim2++)
		{ 
			lIndex[1] =nDim2; 
			SafeArrayGetElement (vaArray.parray, lIndex,pData[x*nDim2UBound+y]);
			y++; 
		} 
		x++; 
	}
	
}
//
//
//
void VariantConvert::Variant2Array(VARIANT vaArray,long& lDimLenght,VOID** pData)
{
	//   //獲得維數 
	//UINT iDim =SafeArrayGetDim(vaStartMark.parray); 

	if (nDim != 1)
	{
		return;
	}
	//   //獲得元素大小,這個沒什麼用 
	UINT uEleSize = SafeArrayGetElemsize(vaArray.parray );
	// 獲得一維的下界和上界 
	long nDim1UBound; 
	long nDim1LBound; 
	SafeArrayGetUBound( vaArray.parray, 1, &nDim1UBound); 
	SafeArrayGetLBound( vaArray.parray, 1, &nDim1LBound);
	//   //計算元素個數,分配空間使用 
	//long nDim1Count = nDim1UBound - nDim1LBound +1; 
	//long nDim2Count = nDim2UBound - nDim2LBound + 1;
	lDimLenght = nDim1UBound - nDim1LBound +1;
	// 轉換 
	int x = 0; 
	int y = 0; 
	long lIndex[1];
	for ( long nDim1 = nDim1LBound; nDim1 < nDim1UBound; nDim1++)
	{ 
			SafeArrayGetElement (vaArray.parray, lIndex,&pData[x]); 
	} 
	x++; 
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一種方法:用.NET中的 Sytem.Guid.NewGuid().ToString() 生成,實際上是對一個128bit數字的十六進位輸出.生成的字元由0-9和a-z這幾種字元組成,也可能會有“-”字元分割. string strNewPW = System.Guid.NewGuid().ToS ...
  • 集合框架可以說是Java裡面必備的知識點了,日常的使用中也會遇到各種情況需要使用到集合。下麵就簡單介紹下各種集合的使用場景: List List可以看做是數組,實現的方式有兩種: ArrayList 適合隨機訪問 LinkedList 適合做插入刪除操作 Queue和Stack 這兩種數據結構都可以 ...
  • 到目前為止並沒有多少手機應用是用python開發的,不過qpython可以作為一個不錯的玩具推薦給大家來玩。 寫一個最簡單的發送簡訊的程式,代碼如下: 三行就可以, _ 那代碼真的是我在躺床上用手機寫的。 來自網上的python發簡訊的代碼例子: 坑點: 手機上的防護軟體可能會預設禁止qpython ...
  • 偶然的機會接觸guava,對於我這種小白來說,google的東西當然是高大上的了,所以抱著學(裝)習(逼)的心態,在網上向前輩們學習了下。當然,我學guava主要也就幾個目的,首先當然是想著能否把guava應用在自己平日的代碼里,如果guava的引用能使代碼的書寫更加簡潔優雅,更著提升程式的性能,減 ...
  • 按照java面向對象的原則,每個基本類型都有對應的包裝類 byte Byte short Short int Integer long Long boolean Boolean float Float double Double char Character 最常用的作用是,基本類型與String字 ...
  • 最近又遇到了幾年前遇到的問題,標記一下。 對於跨位元組位域(bit field)而言,如果數據傳輸前後環境的位元組序不同(LE->BE,BE->LE),簡單地調用(ntohs/ntohl/htons/htonl)並不能正確讀取位域的值。 例如: 其中,tag,field2,pad是位元組內位域,field ...
  • 三、元組(tuple) 特點:Python的元組與列表類似,不同之處在於元組的元素不能修改,元組使用小括弧 四、列表(List) 五、字典(dict) ...
  • 二、運算符 三、基本數據類型 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...