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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2012, 00:20   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию Run-Time Check Failure #0

В чем может быть ошибка? Пробую экспортировать класс из DLL явной компоновкой. Просьба другие способы компоновки не предлагать)))

В общем сама проблема состоит в том, что при завершении программы вылазиет:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Функции в функции main выполняются нормально, но при достижении system("PAUSE"); вылетает данная ошибка.



Вот исходники:

Библиотека DLL:
DLL.h
Код:
#ifndef DLL_H
#define DLL_H

class __declspec(dllexport) Test
{
public:
	void Demo(char *);
};

#endif //DLL_H
DLL_2.cpp
Код:
#include "DLL.h"
#include <iostream>
#include <stdexcept>
using namespace std;

extern "C" void Test::Demo(char *str)
{
	cout << str << endl;
}
И функция main (не DLL)
Код:
#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
	HINSTANCE dll = LoadLibrary(L"DLL_2.dll");
	typedef void(*Demo)(char *str);
	Demo demo;


	demo = (Demo)GetProcAddress(dll,"Demo");

	demo("Test");

	system("PAUSE");
	FreeLibrary(dll);
	return 0;
}
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 16.07.2012, 00:28   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

О забыл еще файл:

Ext.def
Код:
EXPORTS
	Demo
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 16.07.2012, 08:50   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Вы пытаетесь вызвать метод класса как обычную функцию - тогда сделайте чтоб указатель Demo был указателем на член функцию класса.
waleri вне форума Ответить с цитированием
Старый 16.07.2012, 13:31   #4
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Точно спасибо большое заработало.

Код:
#include <iostream>
#include <Windows.h>
using namespace std;

class Test
{
public:
	void (*Demo)();
};

int main()
{
	HINSTANCE dll = 0;
	Test test;

	dll = LoadLibrary(L"DLL_2.dll");
	test.Demo = (void(*)())GetProcAddress(dll,"Demo");

	test.Demo();

	system("PAUSE");
	return 0;
}
Ток блин вот проблема. Приходится, можно сказать класс заново собирать по кускам. Иначе нельзя да по моему?
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 16.07.2012, 13:41   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

То, что вы сделали сейчас можно было сделать со старым кодом объявив функцию Demo статической. То, что у вас получилось сейчас ето клас, в котором есть указатель на функцию - особого смысла в этом нет. Не путайте указатель на функцию с указателем на член-функцию - это две очень большие разницы!
waleri вне форума Ответить с цитированием
Старый 16.07.2012, 14:38   #6
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Тогда если это указатель на функцию, то как объявить указатель на член-функцию из DLL

способ void(Test::*Demo)() не прокатит. Т.к main не будет знать о том что существует класс Test.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 16.07.2012 в 14:56.
kineziz вне форума Ответить с цитированием
Старый 16.07.2012, 16:30   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Тогда забудьте обо всем, ибо кроме всего прочего, для вызова член-функции класса нужен и существующий на объект данното класса. Вернитесь к первоначальному варианту кода, сделайте функцию Demo static и все
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Run-Time Check Failure #2 - Stack around the variable 'map' was corrupted Zugelman Общие вопросы C/C++ 4 26.04.2012 08:39
Ошибка Run-Time Check Failure #2 - Stack around the variable 'tmp' was corrupted. borodin76 Общие вопросы C/C++ 1 16.04.2012 09:35
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. Gidross Общие вопросы C/C++ 9 28.12.2010 15:22
Run-Time Check Failure #3 Xe[N]o Общие вопросы C/C++ 2 27.11.2010 09:01
run-time check failure #2-stack around the variable 't' was corrupted Despar Общие вопросы C/C++ 1 13.05.2010 08:33