刚刚开始第一个ActviceX工程.定义了一些自定义结构.
typedef struct myInfo
{
BSTR strX;
BSTR strY;
}
有一个方法 f(myInfo* info)返回该结构.
在vb 和 c#中引用该自定义结构.
dim info as XXXX.lib.myInfo
f(info)
msgBox info.strX
返回的info.strX是乱码.不知为何.在C#中也是如此.(strX包含中文).
请教各位.
typedef struct myInfo
{
BSTR strX;
BSTR strY;
}
有一个方法 f(myInfo* info)返回该结构.
在vb 和 c#中引用该自定义结构.
dim info as XXXX.lib.myInfo
f(info)
msgBox info.strX
返回的info.strX是乱码.不知为何.在C#中也是如此.(strX包含中文).
请教各位.
现在在c#下也显示成乱码.
为什么在vb6.0下不行呢?我原先用的是 LPCSTR strX .在C#下好用.但在vb6.0时提示机构有不支持的自动化类型.现在我该用 BSTR strX vb6.0下已经不提示自动化类型的问题了.
但显示出来的 strX 在C# 和vb6.0下都是乱码.我看书上说BSTR不是自动化类型吗? 为什么还会有乱码的问题呢?
急啊
2nd. 结构中的BSTR也应该由你的ActviceX分配内存,由调用者释放把你的f()方法贴上来,大家帮你看看
现将f()的方法简要的帖出.希望高手指点.
1.我的f()方法调用***.dll(VC6.0的扩展动态库)文件中的一个方法来装填 *info
f(CString strFilter,myInfo** info)//strFilter 用于传递过虑字符串
{
HINSTRANCE hDelegateDll;//用于保存***.dll句柄
hDelegateDll=AfxLoadLibrary("***.dll");
typedef bool (CALLBACK * FINDWAREINFO)(LPCSTR,WareInfo*);
FINDWAREINFO FindWareInfo;
FindWareInfo=(FINDWAREINFO)GetProcAddress(hDelegateDll,"FindWareInfo");
if(FindWareInfo!=NULL)
{
if(FindWareInfo(strFilter,info))
return S_OK;
else
return S_FALSE;
}
else
{
AfxMessageBox("调用FindWareInfo函数错误");
return S_FALSE;
}
}
f(CString strFilter,myInfo** info)//strFilter 用于传递过虑字符串
句原因的应是
f(CString strFilter,myInfo* info)//strFilter 用于传递过虑字符串补充:
上面代码的***.dll中的FindWareInfo()方法绝对的正确是返回了指针的值的.
另外请教zhp80
2nd. 结构中的BSTR也应该由你的ActviceX分配内存,由调用者释放
该如何实现呢? 最好能给出c#和vb的代码. 谢谢了
1st.我的f() 方法返回的内容应该是正确的.我跟踪过了(通过监视内存).其中的info->strX在通过内存监视时返回的也是正确的字符串.
所以我认为是否将
CString strFilter 改成 BSTR strFilter 不是关键.2nd.另外是否有必要重新封装成com 我认为还是有必要的.因为原先的.dll无法跨语言.而现在可以跨语言了.3sd.我的结构wareinfo和myinfo是一样的而且元素是一一对应的.唯一不同的是元素的类型.WareInfo 中的是 CString 而 myInfo 中的是 BSTR.以为1st.的原因我决定这一点也不应该是关键.4th.我不太明白回调函数的用途和意义.所有也很糊涂.我是参照别人的例子作的.请高手赐教.
可这样的返回类型就是 LPCSTR 了 在vb下有类型不支持自动化的问题.
CString strTemp;//临时变量用于保存临时的字符串
strTemp=(LPCSTR)myInfo->strX;
_bstr_t bstr(str);//构造一个bstr变量
myInfo->strX=bstr;//重新为结构的元素赋值这样处理后在vb和c#中就正常了.
我怀疑问题出在XXXX.dll中结构的元素类型和com中myInfo中类型不一致的问题.问题虽然有办法解决但方法很笨.因为我要对所有的自定义机构中的所有元素进行处理.代码太多了.谢谢各位的支持.