Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2012, 13:30   #1
Paradiz
 
Регистрация: 24.04.2010
Сообщений: 5
По умолчанию Вызов функции, использующей vector, из dll

Всем привет!
Проблема в следующем: есть 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");
}
Paradiz вне форума Ответить с цитированием
Старый 08.09.2012, 16:10   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

Paradiz

первые две функции отлично определяются и работают. А вот 3я - нет,

потому что имя GetFirst искажается согласно специфике C++
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции из DLL Vegas C# (си шарп) 2 19.12.2011 00:57
Вызов функции из DLL(C#) ZverSS88 Помощь студентам 0 25.11.2010 11:27
Вызов произвольной функции из DLL Роман Радер Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 31 05.03.2010 22:35
Повторный вызов функции из dll Smertnik Общие вопросы C/C++ 5 15.05.2009 22:18
Вызов функции из dll-ки VVVadim Общие вопросы Delphi 2 28.04.2009 10:37