2016-04-27 25 views
-2
FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2)) 

這樣的代碼從上面我有在VBA宏。現在我應該用C++代碼創建同樣的東西。據我所知直到現在 - 我應該使用SAFEARRAY類型。 但我仍不明白我應該怎麼做。主要問題 - 我有幾乎純粹的C++代碼。沒有像COleSafeArray這樣的MSVC擴展,沒有ATL支持。 我可以使用的唯一東西 - STLSoft是一個100%標題庫 ,它顯着簡化了像SAFEARRAY這樣的元素的創建。SafeArrays SafeArray?幫助將VBA代碼轉移到C++

但是無論如何 - 它應該是哪個結構?一維SafeArray的兩個VT_I4類型元素的一維SafeArray?

P.S.我應該使用MinGW + gcc 4.x環境。

+0

據我所知,SAFEARRAY是MSVC的東西。你沒有任何問題嗎? –

+0

Oups - 對不起 - 我完全忘記補充說我應該在MinGW + gcc環境下工作。 對於我從MinGW開箱即可使用SAFEARRAY聲明。 所以 - 我甚至沒有試圖分析 - 誰是第一個公司 - 誰開發了它。 – graphElem

+0

@HumamHelfawi,不,SAFEARRAY正是在COM暴露方法中使用數組類型時在VBA/VB6中傳遞的東西。 –

回答

0
// Create a 5x2 safearray of integer arrays with VT_I4 fields... 
comstl::variant fieldInfo; 
fieldInfo.vt = VT_ARRAY | VT_VARIANT; 
{ 
    SAFEARRAYBOUND sab[2]; 
    sab[0].lLbound = 1; sab[0].cElements = 5; // i 
    sab[1].lLbound = 1; sab[1].cElements = 2; // j 
    fieldInfo.parray = SafeArrayCreate(VT_VARIANT, 2, sab); 
} 

// Fill safearray with values like: 
/* 
    FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2)) 
*/ 
// first of all fill the first column with data... 
for(int i=1; i<=5; i++) { 
    VARIANT tmp; 
    tmp.vt = VT_I4; 
    tmp.lVal = i; 
    // Add to safearray... 
    long indices[] = {i,1}; 
    SafeArrayPutElement(fieldInfo.parray, indices, (void *)&tmp); 
} 
// ...after that - fill the second column. 
for(int i=1; i<=5; i++) { 
    VARIANT tmp; 
    tmp.vt = VT_I4; 
    tmp.lVal = 2; 
    // Add to safearray... 
    long indices[] = {i,2}; 
    SafeArrayPutElement(fieldInfo.parray, indices, (void *)&tmp); 
} 

而這段代碼可以讓我達到我的目標!