開發平臺:labwindows/cvi 8.0
#include "windows.h"
#include "oleauto.h"
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
//我呼叫一個API函式,
SAFEARRAY* dAry = NULL;
long aa[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
HRESULT hr=SafeArrayAllocDescriptor(1,&dAry);
dAry->cbElements=sizeof(CIOread[0]);
dAry->rgsabound[0].cElements=16;
dAry->rgsabound[0].lLbound=0;
SafeArrayAllocData(dAry);
}
編譯后報鏈接錯誤
Undefined symbol '_SafeArrayAllocDescriptor@8' referenced in "ZDXLCOMM.c".
Undefined symbol '_SafeArrayAllocData@4' referenced in "ZDXLCOMM.c".
在工程中加入oleaut32.lib也不行,
請高人指教!謝謝
uj5u.com熱心網友回復:
safeArray的使用方法方法一:使用SafeArrayAllocDescriptor在堆疊上創建一維陣列
//創建SAFEARRAY陣列,每個元素為long型,該陣列是一維陣列
long nData[10]={1,2,3,4,5,6,7,8,9,10};
SAFEARRAY* pArray=NULL;
HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//創建SAFEARRAY結構的物件
if(hr!=S_OK)
return;
pArray->cbElements=sizeof(nData[0]);
pArray->rgsabound[0].cElements=10;
pArray->rgsabound[0].lLbound=0;
pArray->pvData=https://bbs.csdn.net/topics/nData;
pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在堆疊上分配資料,并且大小不可以改變(固定為10)
//訪問SAFEARRAY陣列
long* pValue=https://bbs.csdn.net/topics/NULL;
SafeArrayAccessData(pArray,(void**)&pValue);
for(int i=0;irgsabound[0].cElements;i++)
{
cout<
}
SafeArrayUnaccessData(pArray);
SafeArrayDestroy(pArray);
這種方法在堆疊上分配陣列元素所占的空間,即nData陣列所用的空間
方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上創建一維陣列
//創建SAFEARRAY陣列,每個元素為long型,該陣列是一維陣列
long nData[10]={1,2,3,4,5,6,7,8,9,10};
SAFEARRAY* pArray=NULL;
HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//創建SAFEARRAY結構的物件
if(hr!=S_OK)
return;
pArray->cbElements=sizeof(nData[0]);
pArray->rgsabound[0].cElements=10;
pArray->rgsabound[0].lLbound=0;
SafeArrayAllocData(pArray);//注意:這句要寫在給pvData賦值前面,不然用nData給pArray賦值后,使用SafeArrayAllocData會把資料清零
pArray->pvData=https://bbs.csdn.net/topics/nData;
pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在堆疊上分配資料,并且大小不可以改變(固定為10)
//訪問SAFEARRAY陣列
long* pValue=https://bbs.csdn.net/topics/NULL;
SafeArrayAccessData(pArray,(void**)&pValue);
for(int i=0;irgsabound[0].cElements;i++)
{
cout<
}
SafeArrayUnaccessData(pArray);
SafeArrayDestroy(pArray);
方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上創建二維陣列
//定義并初始化設定SafeArray存盤第一行3個元素,第二行4個元素的二維陣列
SAFEARRAY* pArray = NULL;
HRESULT hr = SafeArrayAllocDescriptor(2,&pArray);
if(hr != S_OK)
return;
pArray->cbElements = sizeof(long);
pArray->rgsabound[0].cElements = 3;
pArray->rgsabound[0].lLbound = 0;
pArray->rgsabound[1].cElements = 4;
pArray->rgsabound[1].lLbound = 0;
SafeArrayAllocData(pArray);
//為safeArray的元素賦予值
long lDimension[2]={0};
long element = 1; //safeArray元素值
//第一行賦值
for(int i=0;i<3;i++)
{
lDimension[0] = i; //列
lDimension[1] = 0; //行
SafeArrayPutElement(pArray,lDimension,(void*)&element);
element++;
}
//第二行賦值
for(int i=0;i<4;i++)
{
lDimension[0] = i; //列
lDimension[1] = 1; //行
SafeArrayPutElement(pArray,lDimension,(void*)&element);
element++;
}
//獲取元素
for(int i=0;i<3;i++) //第一行
{
long getElem(0);
lDimension[0] = i;
lDimension[1] = 0;
SafeArrayGetElement(pArray,lDimension,(void*)&getElem);
cout<
}
cout<
for(int i=0;i<4;i++) //第二行
{
long getElem(0);
lDimension[0] = i;
lDimension[1] = 1;
SafeArrayGetElement(pArray,lDimension,(void*)&getElem);
cout<
}
cout<
二維SAFEARRAY陣列使用的時候下標要注意,這里采用的是列主序的方式,即lDimension[1]代表行,lDimension[0]代表列。
方法四:使用SafeArrayCreate在堆上創建一維陣列
long nData[10]={1,2,3,4,5,6,7,8,9,10};
SAFEARRAYBOUND Bound[1]={0};
Bound[0].lLbound = 0;
Bound[0].cElements = 10;
SAFEARRAY* pArray=SafeArrayCreate(VT_I4,1,Bound);
pArray->pvData = nData;
//獲取資料
long *pData=https://bbs.csdn.net/topics/NULL;
HRESULT hr=SafeArrayAccessData(pArray,(void**)&pData);
for(int i=0;irgsabound[0].cElements;i++)
{
cout<
}
SafeArrayUnaccessData(pArray);
SafeArrayDestroy(pArray);
方法五:使用SafeArrayCreate在堆上創建二維陣列
SAFEARRAYBOUND Bound[2]={0};
Bound[0].lLbound = 0;
Bound[0].cElements = 10;
Bound[1].lLbound = 0;
Bound[1].cElements = 3;
SAFEARRAY* pArray=SafeArrayCreate(VT_I4,2,Bound);
long Demen[2];
int element=1;
//第一行賦值
for(long i=0;i<10;i++)
{
Demen[0] = i;
Demen[1] = 0;
SafeArrayPutElement(pArray,Demen,(void*)&element);
element++;
}
//第二行賦值
for(long i=0;i<3;i++)
{
Demen[0] = i;
Demen[1] = 1;
SafeArrayPutElement(pArray,Demen,(void*)&element);
element++;
}
//獲取資料
for(int i=0;i<10;i++) //第一行
{
long getElem(0);
Demen[0] = i;
Demen[1] = 0;
SafeArrayGetElement(pArray,Demen,(void*)&getElem);
cout<
}
cout<
for(int i=0;i<3;i++) //第二行
{
long getElem(0);
Demen[0] = i;
Demen[1] = 1;
SafeArrayGetElement(pArray,Demen,(void*)&getElem);
cout<
}
cout<
組件/客戶中傳遞SAFEARRAY的原則:
1) 在堆上創建SAFEARRAY陣列
2) 一方創建,一方回收
3) 接收方不可以修改SAFEARRAY的資料,只能讀或者銷毀
uj5u.com熱心網友回復:
建議發到c版塊里,比較容易找到答案uj5u.com熱心網友回復:
OleAut32.lib轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/48221.html
標籤:API 調用
上一篇:資料視窗計算列的數值替換
下一篇:安裝PB 11.5出粗
