怎么用(VARIANT*)把自定义的对象或者结构传给客户程序,希望能给个小的事例代码以事件或者方法的形式!谢谢!
解决方案 »
- 请问这哥错在哪里,怎么解决(新手),请详解。
- 怎样将剪贴板上的位图数据保存为BMP图片??
- VC的一个帮助问题
- win32编程, 点击toolbar button会触发什么消息?
- 最新得到MyIE3.01的源程序,可是不能编译通过,有两个错误,大家有编译通过的吗?在这里联系一下
- 有人深入研究过Windows Media Format么?
- 菜鸟系列问题之(三)
- 搞不定的提示。
- MFC对话框背景设置问题
- 哪有编写.RC文件的教程。哪有编写.RC文件的教程。哪有编写.RC文件的教程。哪有编写.RC文件的教程。
- 串行通信问题
- 调用DELPHI的动态库需要传递一个无类型指针(Pointer),出现非法指针操作错误,请兄弟们帮忙看看代码。
IDocument* pDoc;
_variant_t vt = pDoc;
struct Mystuct
{
float x;
float y;
float z;
};
Mystuct m_struct[10];
for(int i=0;i<10;i++)
{
m_struct[i].x=i;
m_struct[i].y=i;
m_struct[i].z=i;
}
HRESULT hr;
//create an array bound
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0; //The first (and only) collumn of our array starts at 0.
rgsabound[0].cElements = 10; //and has 100 elements.
//create the array
SAFEARRAY FAR* pMySafeArray;
pMySafeArray = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
Mystuct *pData;
hr = SafeArrayAccessData( pMySafeArray, reinterpret_cast<PVOID*>(&pData)); //Get a pointer to the data.
//copy the bytes of data from our old array to the new one.
memcpy(pData, m_struct, 120);
for(int i = 0; i < 10; i++) ASSERT(pData[i].x == m_struct[i].x);
SafeArrayUnaccessData(pMySafeArray);
//To put the SafeArray in a Variant
VARIANT myVariant;
myVariant.parray = pMySafeArray;
myVariant.vt = VT_ARRAY; VARIANT NewVariant;
NewVariant.vt = VT_EMPTY; // must set variant type for copy to work.
hr = VariantCopy(&NewVariant, &myVariant); //check array in copy of variant
Mystuct* pNewData;
hr = SafeArrayAccessData(NewVariant.parray, reinterpret_cast<PVOID*>(&pNewData));
for(int i = 0; i < 10; i++) ASSERT(pData[i].x == pNewData[i].x);
//ASSERT(pData != pNewData); //copying the varriant created a new copy of the
//array it contained too. There is now 2 copies of the data.
SafeArrayUnaccessData(NewVariant.parray);
你这么传到VB里肯定是没法用的,标准的解决方案是做一个枚举器对象,通过枚举对象返回数据,类似ADO里的Recoderset
{
int InCount;
int OutCount;
char *Name;
}MyData;//结构体包成variant
PutData(VARIANT *val)
{
HRESULT hr;
SAFEARRAY *psaData = NULL;
SAFEARRAYBOUND saBound = {4,0};
MyData *pMyData = NULL;psaData = SafeArrayCreate(VT_VARIANT,1,&saBound);hr = SafeArrayAccessData(psaData,reinterpret_cast<void **>(&pMyData));pMyData[0].InCount = 8;
pMyData[0].OutCount = 2;
pMyData[0].Name = "LZY1";
pMyData[1].InCount = 11;
pMyData[1].OutCount = 5;
pMyData[1].Name = "LZY2";
pMyData[2].InCount = 13;
pMyData[2].OutCount = 4;
pMyData[2].Name = "LZY3";
pMyData[3].InCount = 15;
pMyData[3].OutCount = 1;
pMyData[3].Name = "LZY4";hr = SafeArrayUnaccessData(psaData);(*val).vt = VT_ARRAY;
(*val).parray = psaData;
}
http://www.csdn.net/Develop/Read_Article.asp?Id=19697
library XXXXXXXXLib
{
importlib(STDOLE_TLB);
importlib(STDTYPE_TLB); typedef
[
helpstring("control item data"),
version(1.0)
]
struct CtrlItem
{
[helpstring("Item text")]
BSTR Text;
[helpstring("Item value( type integer )")]
LONG Value;
[helpstring("Item is selected")]
VARIANT_BOOL Selected;
}CtrlItem; typedef
[
helpstring("Alignment Enumeration"),
v1_enum,
version(1.0)
]
enum EAlignment
{
eaLeft = 0,
eaCenter = 1,
eaRight = 2
}EAlignment;
......
}
typedef
[
helpstring("control item data"),
version(1.0)
]
但是定义枚举是
typedef
[
helpstring("Alignment Enumeration"),
v1_enum,
version(1.0)
]
是不是定义结构的时候[]里面还得写个v1_..的,希望给于指点,谢谢!
用SafeArray传。下面是代码:
void CMyIeDlg::putArrays()
{
HRESULT hr;
SAFEARRAY* psaStudent = NULL;
SAFEARRAYBOUND rgbounds = { 4, 0 };
studentsInfo *pStudentStruct = NULL; psaStudent = SafeArrayCreate(VT_VARIANT, 1, &rgbounds);
hr = SafeArrayAccessData(psaStudent, reinterpret_cast<PVOID*>(&pStudentStruct)); pStudentStruct[0].grade = 3;
pStudentStruct[0].name = SysAllocString(L"Shaun");
pStudentStruct[0].type = class_Clown;
pStudentStruct[1].grade = 8;
pStudentStruct[1].name = SysAllocString(L"Fred");
pStudentStruct[1].type = school_Bully;
pStudentStruct[2].grade = 12;
pStudentStruct[2].name = SysAllocString(L"Steve");
pStudentStruct[2].type = teachers_Favorite;
pStudentStruct[3].grade = 3;
pStudentStruct[3].name = SysAllocString(L"Linda");
pStudentStruct[3].type = teachers_Favorite; hr = SafeArrayUnaccessData(psaStudent);
m_array.vt = VT_ARRAY;
m_array.parray = psaStudent;}void CMyIeDlg::getArrays()
{
HRESULT hr;
SAFEARRAY* psaStudent = NULL;
studentsInfo *pStudentStruct = NULL;
studentsInfo students[4]; psaStudent = m_array.parray;
hr = SafeArrayAccessData(psaStudent, reinterpret_cast<PVOID*>(&pStudentStruct));
for(int i = 0; i<4;i++)
{
students[i].grade = pStudentStruct[i].grade ;
students[i].name = pStudentStruct[i].name ;
students[i].type = pStudentStruct[i].type ;
}
hr = SafeArrayUnaccessData(psaStudent);
}