我这几天在学习OCX控件编写,遇到了些问题,特向您请教:
1、OCX接口返回值
想返回一个BYTE*类型的数据,但是在JS端调用时,得不到返回值,您帮我看一下了。
STDMETHODIMP CZNActiveXATL::BioCapture(BYTE* Birptr)
{
// TODO: 在此添加实现代码
int ret = 0;
bool beepon = true;
BYTE birptr[588];//;= (BYTE *)malloc(sizeof(BYTE)*588);
Birptr = (BYTE*)malloc(sizeof(BYTE)*588);
MessageBox(NULL, L"CAP...!", L"demo", MB_OK);
ret = this->ZN_capture(static_cast<bool>(beepon),static_cast<BYTE *>(birptr));
//测试是否已读取信息,测试结果正确
FILE *file = fopen("f:\\biodata_.txt", "wb+");
if (file != NULL) {
MessageBox(NULL, L"xinxi成功!", L"demo", MB_OK);
}
fwrite(birptr, 1,sizeof(birptr), file);
fclose(file);
MessageBox(NULL, L"CAP成功!", L"demo", MB_OK);
//将采集的信息转存至Birptr,作为函数的返回值
memcpy( Birptr,birptr ,588);
//new add 21:24
//基于BSTR*的处理:STDMETHODIMP CZNActiveXATL::BioCapture(BSTR* Birptr)
/* int ret = 0;
bool beepon = true;
BYTE birptr[588];//;= (BYTE *)malloc(sizeof(BYTE)*588);
ret = this->ZN_capture(static_cast<bool>(beepon),static_cast<BYTE *>(birptr));
int birptr_len = strlen(birptr);
char str[32];
itoa(birptr_len,str,10);//将int类型的数转换为字符串
MessageBox(NULL,(LPCTSTR)str, L"demo", MB_OK);
////////////////////////////////////////////////////////////////
memset(birptr, 0, 588);
BSTR bs = ::SysAllocString(birptr);
//_bstr_t str = (char*)birptr;
//str.GetBSTR();
//*Birptr = CComBSTR(birptr).Copy();//返回字符串 是不是操作结束之后会释放空间呢?
//BSTR bstrText = ::SysAllocString(L value);::SysAllocString(L birptr)
*/
this->_AtlFinalRelease();
return S_OK;
}
JS端:
var sum = CZNActiveXATL.BioCapture();
谢谢

解决方案 »

  1.   

    看不懂你到底什么问题。注意。BSTR和CString是不一样的。要做下装换。
      

  2.   

    返回一个字符串就好了,用BSTR类型。
      

  3.   

    嗯 我也是这么做的  JS端处理ANSI码还是有问题的   即使要转换为字符串,也必须要将其转换为UNICODE码  
      

  4.   


    JS处理ANSI码有问题,那是因为你的网页不是ANSI,而你的ocx生成的字符串是ANSI的吧,只要修改成一致就不需要转换了。不过通过js写个转换的接口就更通用了!