2016-04-05 2 views
0

У меня есть библиотеки DLL с внешним методомс ++ вызов из длл другой 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 и мусор системы.

EDIT basic_hash это класс

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

пожалуйста вывесить подпись pointerBasicHash :: хэш() –

+0

жаль я изменить код pointerBasicHash это 'basic_hash * pointerBasicHash;' – 6azbljlb

+0

Проверили вы 'hash' функцию класса' pointerBasicHash' вы получите? – grisumbras

ответ

1

некоторые возможности:

  1. DLL, был составлен с другой версией библиотеки C++ выполнения

  2. DLL, который был связан статически против библиотеки времени c +

  3. Ваша заявка связана статически с библиотекой времени выполнения C++

  4. В DLL есть ошибка.

Примечание. Как правило, очень серьезная ошибка - предлагать стандартные типы библиотек C++ в интерфейсе DLL.

Когда стандартная библиотека изменяется (например, компилятор обновляется), вам может потребоваться перекомпилировать как библиотеку, так и все приложения, которые ее используют ..., которая в первую очередь поражает объект использования общей библиотеки.

+0

Что значит? "статически против" – 6azbljlb