1. Акция на весь декабрь! Получай оплату х2 за уникальные статьи, объемом от 200 слов, если в заголовке темы и теле статьи присутствует слово Python
    Скрыть объявление

Вызов Функции, Использующей Vector, Из Dll

Тема в разделе "MS Visual C++", создана пользователем evilive, 8 сен 2012.

  1. evilive

    evilive Гость

    Всем привет!
    Проблема в следующем: есть dll-ка, в ней 3 простых функции:
    1. Sum - сложение 2х целых чисел.
    2. Concat - соединяет 2 строки.
    3. GetFirst - возвращает 1й элемент вектора, переданного ей в качестве параметра.

    Далее эта длл динамически загружается, и первые две функции отлично определяются и работают. А вот 3я - нет, программа ее не видит. Как это исправить? Причем интересует случай, когда подключается .dll-файл без хэдэра. Написано все на Visual С++ 2008.

    dll, header:
    Код (C++):
    #include <iostream>
    #include <vector>
    using namespace std;

    extern "C" __declspec(dllexport) int Sum(int val1, int val2);

    extern "C" __declspec(dllexport) string Concat(string str1, string str2);

    extern __declspec(dllexport) int GetFirst(vector<int> SomeVector);
    cpp:
    Код (C++):
    #include "SmthStpd.h"

    extern "C" __declspec(dllexport) int Sum(int val1, int val2)
    {
    return val1 + val2;
    }

    extern "C" __declspec(dllexport) string Concat(string str1, string str2)
    {
    return str1.append(str2);
    }

    extern __declspec(dllexport) int GetFirst(vector<int> SomeVector)
    {
    return SomeVector[0];
    }
    приложение:
    Код (C++):
    #include <windows.h>
    #include <iostream>
    #include <vector>
    #include <string>

    using namespace std;

    void main()
    {
    HINSTANCE hLib = LoadLibrary(L"universal.dll");

    if (hLib == NULL)
    {
    cout << "Unable to load library!" << endl;
    system("pause");               
    return;
    }

    /*----функция Sum----*/
    typedef int(*function1Dll)(int, int);
    function1Dll Sum = (function1Dll)GetProcAddress(hLib, "Sum");

    if (Sum == NULL)
    {
    cout << "Unable to load Sum." << endl;     
    system("pause");
    return;
    }

    cout << Sum(4, 6) << endl;

    /*----функция Concat----*/
    typedef string(*funcDll)(string, string);
    funcDll Concat = (funcDll)GetProcAddress(hLib, "Concat");

    if (Concat == NULL)
    {
    cout << "Unable to load Concat." << endl;      
    system("pause");
    return;
    }

    cout << Concat("a", "b") << endl;

    /*----функция GetFirst----*/
    typedef int (*function2Dll)(vector<int>);

    //    собственно здесь GetFirst и не находится, она равна NULL
    function2Dll GetFirst = (function2Dll)GetProcAddress(hLib, "GetFirst");  
    if (GetFirst == NULL)
    {
    cout << "Unable to load GetFirst." << endl;    
    system("pause");
    return;
    }

    vector<int> Vec;
    Vec.push_back(1);
    Vec.push_back(2);
    Vec.push_back(3);

    cout << GetFirst(Vec) << endl;
    system("pause");
    }
     
  2. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    В extern __declspec(dllexport) пропущено "C"
    Поэтому генерируется "хитрое" имя.

    Или добавить "C" или посмотреть как называется экспортированная функция, например в depends и использовать это имя в GetProcAddress. Но это менее надёжно, т.к. имя может поменяться если сменить компилятор.
     
Загрузка...
Похожие Темы - Вызов Функции Использующей
  1. Sanchezz86
    Ответов:
    1
    Просмотров:
    581
  2. LetMeFun
    Ответов:
    1
    Просмотров:
    1.227
  3. roma4717
    Ответов:
    1
    Просмотров:
    1.451
  4. azzza
    Ответов:
    6
    Просмотров:
    2.853
  5. Whatka
    Ответов:
    1
    Просмотров:
    1.248

Поделиться этой страницей