我正在尝试在C ++中调用托管dll上的方法。其中一个参数是一个字节数组,库导入转换为LPSAFEARRAY。字节数组/ LPSAFEARRAY旨在作为文件的内容。如何将文件读入LPSAFEARRAY以传入方法?
以下是生成的库头文件中的函数签名:
virtual HRESULT STDMETHODCALLTYPE AlterDocument(
LPSAFEARRAY document/*[in]*/,
LPSAFEARRAY* pRetVal/*[out,retval]*/) = 0;
第二个参数是另一个字节数组,当它从方法返回时我需要使用它。
答案 0 :(得分:1)
您最初可以创建SAFEARRAYBOUND
并将其初始化为C数组,例如SAFEARRAYBOUND sabdBounds[2] = { {10, 0}, {20, 0\} };
然后使用适当类型的SafeArrayCreate
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms221234(v=vs.85).aspx)维度以获得所需的LPSAFEARRAY
。
<强>更新强>
这是一段显示如何创建LPSAFEARRAY
的代码,因为您可以看到我在创建数组之前找到文件的大小,以便我能够直接读取数据,还可以将文件内容存储在某个中间缓冲区中,然后再创建SAFEARRAYBOUND
:
#include <Windows.h>
#include <fstream>
#include <cstdlib>
int main(int argc, char** argv)
{
std::streampos fileSize = 0;
std::ifstream inputFile("file.bin", std::ios::binary);
fileSize = inputFile.tellg();
inputFile.seekg( 0, std::ios::end );
fileSize = inputFile.tellg() - fileSize;
SAFEARRAYBOUND arrayBounds[1] = { {fileSize, 0}}; // You have one dimension, with fileSize bytes
LPSAFEARRAY safeArray = SafeArrayCreate(VT_I1, 1, arrayBounds);
SafeArrayLock(safeArray);
char* pData = reinterpret_cast<char*>(safeArray->pvData); // This should be the pointer to the first element in the array, fill in the data as needed
// Do your stuff
SafeArrayUnlock(safeArray);
SafeArrayDestroy(safeArray);
inputFile.close();
}
答案 1 :(得分:0)
如果你有ATL:
ifstream in(...);
CComSafeArray<BYTE> fileContents;
for (ifstream::traits_type::int_type ch = in.get(); ch != ifstream::traits_type::eof(); ch = in.get())
fileContents.Add(ch);
managedObject->AlterDocument(fileContents, ...);
如果您没有ATL,则必须在没有CComSafeArray包装的情况下直接操作SAFEARRAY。
答案 2 :(得分:0)
一个选项可能是获取ifstream
大小,然后创建一个SAFEARRAY
,其大小适当,以存储整个文件内容,然后read()
将文件内容放入{{1}记忆。
代码可能是这样的(在方便的ATL::CComSafeArray
包装器的帮助下):
SAFEARRAY