我试图在C++中的托管dll上调用方法。参数之一是字节数组,库导入后将其转换为LPSAFEARRAY。字节数组/ LPSAFEARRAY旨在作为文件的内容。如何将文件读入LPSAFEARRAY以传递给方法?

这是生成的库头文件中的函数签名:

virtual HRESULT STDMETHODCALLTYPE AlterDocument(
   LPSAFEARRAY document/*[in]*/,
   LPSAFEARRAY* pRetVal/*[out,retval]*/) = 0;

第二个参数是另一个字节数组,当它从方法返回时,我将需要使用它。

最佳答案

您可以首先创建一个SAFEARRAYBOUND并像C数组一样对其进行初始化,例如SAFEARRAYBOUND sabdBounds[2] = { {10, 0}, {20, 0\} };,然后使用具有适当类型和尺寸的SafeArrayCreate(http://msdn.microsoft.com/zh-cn/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();
    }

关于c++ - 如何将fstream读入LPSAFEARRAY?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13034585/

10-09 13:09