PHPでCOMコンポーネントから返された文字列を取得する方法

WBOY
リリース: 2016-06-13 13:26:57
オリジナル
919 人が閲覧しました

PHPでCOMコンポーネントから返された文字列を取得するにはどうすればよいですか?
COM コンポーネントでメソッドを定義します
HRESULT GetStr([in,out] BSTR* vStr, [in,out] LONG* vLen, [out,retval] LONG* vError);

メソッドとして実装:

C/C++ コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
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 はこのメソッドを呼び出します
C/C++ コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
$tStr = "";
$tLen = 100;
$tStr = str_pad($tStr, $tLen, "0");
$tRes = $tCom->GetStr(&$tStr, &$tLen);

ログイン後にコピー


結果
$tRes = 1;
$tStr = "";
$tLen = 26;

解決策: $tStr が空なのはなぜですか?

-----解決策--------------------------------
取得するには vsscanf 関数を使用する必要がある場合があります
テスト条件がないため、これ以上の提案はできません
------解決策------------------
memcpy(*vStr, tStr, wcslen(tStr));

wcslen は UNICODE 文字の数を見つけるためのもので、memcpy はバイト数をコピーするもので、明らかに wcslen(tStr)*2 である必要があります。これは *vStr ではなく、直接 vStr です。
------解決策---------
話し合う

memcpy(*vStr, tStr, wcslen(tStr));

wcslen は UNICODE 文字数を見つけるためのもので、memcpy はバイト数をコピーするものです。明らかに、それは wcslen(tStr である必要があります) )*2 、これは *vStr ではなく、直接 vStr です。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート