2016-04-27 45 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をサポートしていません。 私が使用できる唯一のものは - 100%ヘッダー専用ライブラリー であるSTLSoftは、SAFEARRAYのような要素の作成を大幅に簡素化します。SafeArraysのSafeArray? VBAコードをC++に転送するためのヘルプ

しかし、どのような構造であっても、どのような構造にする必要がありますか? 1D SafeArrayの1D SafeArraysは2つのVT_I4タイプの要素ですか?

P.S.私はMinGW + gcc 4.x環境を使うべきです。

+0

私が知る限り、SAFEARRAYはMSVCのものです。それに何か問題はありませんか? –

+0

Oups - 申し訳ありません - 私はMinGW + gcc環境で作業する必要があることを完全に忘れてしまいました。 そして、SAFEARRAY宣言はMinGWからの私のためのただのavaialbleです。 - それを開発した最初の会社だった - 分析することさえしなかった。 – 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); 
} 

このコードで私の目標を達成できました!

関連する問題