描述:
我想用VC的OLE自动化控制sigmaplot作图
在VB里面可以这么实现:
Dim ColumnsPerPlot(1) As Variant
ColumnsPerPlot(0) = 1 'x axis
ColumnsPerPlot(1) = 0 'y axis
Dim PlotColumnCountArray()
ReDim PlotColumnCountArray(0)
PlotColumnCountArray(0) = 2 'number of axis
Dim ss As Boolean
ss = GraphPage.CreateWizardGraph("Line Plot", "Simple Spline Curve", "XY
Pair", ColumnsPerPlot, PlotColumnCountArray, "Worksheet Columns", "Standard
Deviation", "Degrees", 0#, 360#, , "Standard Deviation", True)
在VC里面CreateWizardGraph这个函数的参数全部变成VARIANT型的
ColumnsPerPloty,PlotColumnCountArray都是数组,是不是传递数组要用SAFEARRAY,
但是看了MSDN还是不明白,SAFEARRAY该怎么赋值和包装进VARIANT里面去啊
一下是我的程序,运行的时候老是说参数错误,高手看看有什么问题。
SAFEARRAY *pSa = NULL;
long index[1], d;
VARIANT vColumnArray;
pSa = SafeArrayCreateVector(VT_I4, 0, 2);
index[0] = 4;
d = 1;
SafeArrayPutElement(pSa, index, &d);
index[0] = 5;
d = 0;
SafeArrayPutElement(pSa, index, &d);
vColumnArray.vt = VT_ARRAY | VT_I4;
vColumnArray.parray = pSa;
SAFEARRAY *pSa0 = NULL;
long index0[1], d0;
VARIANT vPlotColumnCountArray;
pSa0 = SafeArrayCreateVector(VT_I4, 0, 1);
index0[0] = 0;
d0 = 2;
SafeArrayPutElement(pSa0, index0, &d0);
vPlotColumnCountArray.vt = VT_ARRAY | VT_I4;
vPlotColumnCountArray.parray = pSa0;
GraphPage.CreateWizardGraph(_variant_t("Line Plot"),
_variant_t("Simple Spline Curve"),_variant_t("XY Pair"),
vColumnArray,SafeArrayPutElement ,
_variant_t("Worksheet Columns"), _variant_t("Standard Deviation"),
_variant_t("Degrees"), _variant_t((short)0), _variant_t((short)360),
vtMissing,
COleVariant("Standard Deviation"),
_variant_t(bool(1))
);
解决方案1:
You can use CComVariant ,see this example:
POINT pt = { 0 };
GetCursorPos(&pt);
CComVariant varHwnd((LONG)hwnd);
CComVariant varX(pt.x);
CComVariant varY(pt.y);
SAFEARRAY* psa = SafeArrayCreateVector(VT_VARIANT, 0, 3);
LONG lIndex = 0;
SafeArrayPutElement(psa, &lIndex, &varHwnd);
lIndex++;
SafeArrayPutElement(psa, &lIndex, &varX);
lIndex++;
SafeArrayPutElement(psa, &lIndex, &varY);
CComVariant varArgIn;
V_VT(&varArgIn) = VT_ARRAY | VT_I4;
V_ARRAY(&varArgIn) = psa;
pBrowser->ExecWB(OLECMDID_SHOWPAGEACTIONMENU, (OLECMDEXECOPT)dwPageActionFlags, &varArgIn, NULL);
参考:http://dev.19xz.com/soft/74735.htm