Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции, использующей vector, из dll 
:(
    Опции темы
Paradiz
Дата 8.9.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2010

Репутация: нет
Всего: нет



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

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

dll, header:
Код

#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:
Код

#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];
}


приложение:
Код

#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");
}

PM MAIL   Вверх
Earnest
Дата 10.9.2012, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Потому что ф-я GetFirst вовсе не называется "GetFirst", у нее более сложное имя. Почитай про декорирование имен. Декорированное имя можно узнать из map-файла.
 
Цитата(Paradiz @  8.9.2012,  13:37 Найти цитируемый пост)
Причем интересует случай, когда подключается  .dll-файл без хэдэра

Наличие хедера ни на что не влияет. Ты, видимо, хотел сказать, что библиотека подгружается динамически, а не через зависимости при сборке.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0397 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.