用dd其他dll用std :: vector调用C ++

时间:2016-04-05 11:29:33

标签: c++ vector dll stdvector

我有一个带外部方法的dll

extern "C" HAL_HASH_API basic_hash* getAlgorithmInstance( int algorithm );

和basic_hash有下一个方法

// resets to the initial condition of the algorithm, 
// reset the counter and the current values
virtual void reset() = 0;

// performs all encryption cycle. 
virtual void hash( const byte*, uint64, vector_byte& ) = 0;

第一个参数<data>是指向数据开头的指针,第二个<size>参数指定散列数据的大小,第三个参数<hash>是要存储的缓冲区哈希值。矢量大小会自动更改。

我有下一个类型

typedef unsigned char byte;
typedef unsigned long long uint64;
typedef std::vector< byte > vector_byte;

当我初始化变量并调用hash

RUNSCRIPT_FUNCTION  runScript;
    basic_hash*  pointerBasicHash;
    // Load the DLL
    HINSTANCE dll = LoadLibrary(L"HAL.dll");
    if (dll == NULL)
    {
        printf("Unable to load library\n");
    }
    // Get the function pointer
    runScript = (RUNSCRIPT_FUNCTION)GetProcAddress(dll, "getAlgorithmInstance");
    if (runScript == NULL)
    {
        FreeLibrary(dll);
        printf("Unable to load function\n");
    }
    // Call the function 
    pointerBasicHash= (runScript)(0);
    vector_byte hashresult;
    hashresult.reserve(1024);
    uint64 size = 8;
    byte myString[] = "1234567";
    const byte* buff = &myString[0];

pointerBasicHash->reset();
pointerBasicHash->hash(buff, size, hashresult);

变量hashresult不正确,它包含系统变量PATH和垃圾。

编辑basic_hash它的类

extern "C"  class  basic_hash
    {
    public:
        virtual ~basic_hash() {}
        virtual void reset() = 0;   
        virtual void hash(const byte*, uint64, vector_byte&) = 0;
    };

1 个答案:

答案 0 :(得分:1)

一些可能性:

  1. DLL已针对不同版本的c ++运行时库

  2. 进行编译
  3. DLL已经静态链接到c +运行时库

  4. 您的应用程序已静态链接到c ++运行时库

  5. DLL中有一个错误。

  6. 请注意。在DLL的接口中提供c ++标准库类型通常是一个非常严重的错误。

    当标准库发生更改时(例如,编译器已升级),您可能需要重新编译库和使用它的所有应用程序...这首先会破坏使用共享库的对象。