gpt4 book ai didi

c++ - 如何序列化 VARIANT 或 BSTR?

转载 作者:太空狗 更新时间:2023-10-29 23:10:36 24 4
gpt4 key购买 nike

我正在尝试找出一些 COM 编码功能。最终,我想将一个深度嵌套的变体数组保存到文件中,但我首先尝试使用一个简单的字符串。我意识到这些 API 用于远程过程调用,但我希望这种序列化也适用于文件持久化。

我经常使用 Excel VBA,发现这个序列化 API 真是大开眼界。

下面的代码将一个 BSTR 序列化到一个缓冲区,缓冲区被复制,它将作为保存到文件和从文件加载的替代品。

当前的问题是 BSTR_UserUnmarshal 在 RPCMarshalling.exe 中的 0x7631C762 (KernelBase.dll) 处引发异常 未处理的异常:0x00000057:参数不正确。发生了

我的语法可能有误,因为我正在使用示例代码片段。目标是使用 RPC 序列化 API 调用从 srctest 获取字符串到 desttest。

// RPCMarshalling.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include "pch.h"
#include <iostream>

//https://searchcode.com/file/140723732/dlls/oleaut32/tmarshal.c#l-818

typedef struct _marshal_state {
LPBYTE base;
int size;
int curoff;
} marshal_state;


int main()
{
::CoInitialize(0);

CComBSTR srctest("Hello");
marshal_state srcbuf;
memset(&srcbuf, 0, sizeof(srcbuf));
ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);

ULONG size = ::BSTR_UserSize(&flags, 0, &srctest);

DWORD newsize = max(size, 256);
(&srcbuf)->base = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newsize);
if (!(&srcbuf)->base)
return E_OUTOFMEMORY;

::BSTR_UserMarshal(&flags, (&srcbuf)->base + (&srcbuf)->curoff, &srctest);
(&srcbuf)->curoff = size;


std::cout << "Hello World!\n" << size << "\n";


marshal_state destbuf;
memset(&destbuf, 0, sizeof(destbuf));

(&destbuf)->base = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newsize);
if (!(&destbuf)->base)
return E_OUTOFMEMORY;

/* pretend we are loading from file saved by src buffer */
RtlCopyMemory((&destbuf)->base, (&srcbuf)->base, newsize);


CComBSTR desttest("");
BSTR deststring;

try
{
unsigned char *buffer;
buffer = ::BSTR_UserUnmarshal(&flags, (&destbuf)->base, &deststring);
}
catch (int e)
{
std::cout << "Error:" << e << "\n" << size << "\n";
}



::CoUninitialize();

}

最佳答案

实现序列化 Variant 目标的替代方法(根据 OP 的问题文本)正在进行中,使用 Simon Mourier 关于 StgSerializePropVariant 的建议

int main()
{
::CoInitialize(0);

CComVariant srctest("Hello");

SERIALIZEDPROPERTYVALUE* serialized;
ULONG cb;
::StgSerializePropVariant((PROPVARIANT*)&srctest, &serialized, &cb);

CComVariant pvDest;
::StgDeserializePropVariant(serialized, cb, (PROPVARIANT*)&pvDest);

CoTaskMemFree(serialized);

CComBSTR strDest(pvDest.bstrVal);
std::cout << "This got serialized:\n" << LPCSTR(_bstr_t(strDest, true)) << "\n";

::CoUninitialize();
}

关于c++ - 如何序列化 VARIANT 或 BSTR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56519062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com