COM组件中定义一个方法
HRESULT GetStr([in,out] BSTR* vStr, [in,out] LONG* vLen, [out,retval] LONG* vError);方法实现为:STDMETHODIMP MC_MyClass::GetStr(BSTR* vStr, LONG* vLen, LONG* vError)
{
    *vError = 0;
    if(0 == vStr)    return S_FALSE;
    if(0 == vLen)    return S_FALSE;    wchar_t tStr[] = L"This is a string from com!";
    memcpy(*vStr, tStr, wcslen(tStr));
    *vLen = wcslen(tStr);    *vError = 1;
    return S_OK;
}
PHP调用该方法$tStr = "";
$tLen = 100;
$tStr = str_pad($tStr, $tLen, "0");
$tRes = $tCom->GetStr(&$tStr, &$tLen);
 结果
$tRes = 1;
$tStr = "";
$tLen = 26;求解:为什么$tStr为空?

解决方案 »

  1.   

    你在  C 中都要  memcpy,可见你的 dll 写的有问题(只能被 从调用)
    若要适用于其他语言,则  memcpy 要在 dll 内部完成
      

  2.   

    dll中用的正是memcpy,而且用vs的测试工程测试通过,就是php加载不行
      

  3.   

    可能要用 vsscanf 函数取回
    由于没有测试条件,无法给出进一步的建议
      

  4.   

    memcpy(*vStr, tStr, wcslen(tStr));wcslen是求UNICODE字符个数, memcpy是拷贝字节个数, 很明显应该wcslen(tStr)*2,另外也不是*vStr,直接是vStr.
      

  5.   

    嗯,长度是wcslen(tStr)*2+2,我知道了,
    但BSTR的定义是typedef wchar_t WCHAR;
    typedef WCHAR OLECHAR;
    typedef OLECHAR __RPC_FAR *BSTR;所以是*vStr,而不是用vStr