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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2011, 01:03   #1
voicel
 
Регистрация: 06.01.2010
Сообщений: 9
По умолчанию DLL не работает

Прошу помощи.
Сам написал dll, функции из нёё исправно вызываются из приложения на С++, но во время работы все время скачет ошибка

MVC++ Runtime Library!
Runtime error!
R6031!

Сама dll
Код:
#include <windows.h>

#include "mysql.h"
#include "my_global.h"

MYSQL sql;

void sql_init();
void sql_connect(LPSTR, LPSTR, LPSTR, LPSTR);
void sql_query(LPSTR);
void sql_close();

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		break;

	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

void sql_init()
{
	mysql_init(&sql);
}

void sql_connect(LPSTR host, LPSTR user, LPSTR pass, LPSTR base)
{
	mysql_real_connect(&sql, host,  user, pass, base, 0, NULL, 0);
}

void sql_query(LPSTR query)
{
	mysql_query(&sql, query);
}

void sql_close()
{
	mysql_close(&sql);
}
def файл
Код:
LIBRARY	"controldll"
EXPORTS
	sql_init		@1
	sql_connect		@2
	sql_query	    @3
	sql_close	    @4
программа
Код:
#include <iostream>
using namespace std;
#include <conio.h>
#include <Windows.h>

HMODULE hInst;
void (*f1)();
void (*f2)(LPSTR, LPSTR, LPSTR, LPSTR);
void (*f3)(LPSTR);
void (*f4)();

void main()
{
	hInst = LoadLibrary("controldll.dll");

	if (!hInst)
		cout << "ERROR" << endl;
	else
		cout << "RABOTAET" << endl;

	f1 = (void(*)())GetProcAddress(hInst, "sql_init");
	f2 = (void(*)(LPSTR, LPSTR, LPSTR, LPSTR))GetProcAddress(hInst, "sql_connect");
    f3 = (void(*)(LPSTR))GetProcAddress(hInst, "sql_query");
	f4 = (void(*)())GetProcAddress(hInst, "sql_close");

	f1();
	f2("localhost","root","","");
	f3("create database Cplusplus");
	f4();

	FreeLibrary(hInst);
	getch();

}

второй день мучаюсь гугл не помог.
длл работает исправно база данных создается.
но эта ошибка всегда во время исполнения программы.
voicel вне форума Ответить с цитированием
Старый 10.08.2011, 17:54   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от MSDN
C Run-Time Error R6031
Error Message
Attempt to initialize the CRT more than once. This indicates a bug in your application.
Почитай, может, что толковое найдешь.
counter вне форума Ответить с цитированием
Старый 10.08.2011, 19:23   #3
voicel
 
Регистрация: 06.01.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
Почитай, может, что толковое найдешь.
Читал, но ни выключение в проекте crt, ни всякие #pragma не помогли.

Проблему эту решил убрав функцию FreeLibrary.
Если не трудно, не могли бы вы посмотреть, может я в библиотеке своей что напутал с кодом?
voicel вне форума Ответить с цитированием
Старый 10.08.2011, 22:19   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от voicel Посмотреть сообщение
Проблему эту решил убрав функцию FreeLibrary.
Если не трудно, не могли бы вы посмотреть, может я в библиотеке своей что напутал с кодом?
А выгружать длл кто будет?
С кодом вроде все в порядке. У меня работает (правда без sql) MVS2008 Win XP SP3.
Может проблема в либах sql ?
counter вне форума Ответить с цитированием
Старый 10.08.2011, 22:37   #5
voicel
 
Регистрация: 06.01.2010
Сообщений: 9
По умолчанию

Спасибо что посмотрели.
Да, попробовал без sql - all ok.

Проблему "Ошибки времени выполнения" решил через использование функций sql динамическим связыванием. Но тут другая проблема, никак не возвращается адрес функции из моей dll в приложение.

dll
Код:
#include <Windows.h>
#include <mysql.h>
#include <my_global.h>

HMODULE hLibrary;
MYSQL sql;

MYSQL* (__stdcall *sql_real_connect)(MYSQL *, const char *, const char *, const char *, 
	const char *, unsigned int, const char *, unsigned long);
int (__stdcall *sql_query)(MYSQL *, const char *);
MYSQL *(__stdcall *sql_init)(MYSQL *);
void query(const char*);

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		hLibrary = LoadLibrary(L"libmysql.dll");
		sql_init = mysql_init;
		sql_real_connect = mysql_real_connect;
		sql_query = mysql_query;
		sql_init(&sql);
	    sql_real_connect(&sql, "localhost", "root", "", "", 0, NULL, 0);
		break;

	case DLL_PROCESS_DETACH:
		FreeLibrary(hLibrary);
		break;
	}
	return TRUE;
}

void query(const char *arg)
{
	mysql_query(&sql, arg);
}
def
Цитата:
LIBRARY "controldll"
EXPORTS
query @1
Адрес query никак не возвращается.
Буду очень благодарен если посмотрите это.
Ну а если тут всё ок, то ну его нахрен, sql, забью))
voicel вне форума Ответить с цитированием
Старый 10.08.2011, 22:48   #6
voicel
 
Регистрация: 06.01.2010
Сообщений: 9
По умолчанию

Да, вы правы.
Сделав из query просто функцию сложения ее адрес вернулся без проблем.
Убогие sql либы

Очень благодарен за помощь.
voicel вне форума Ответить с цитированием
Старый 10.08.2011, 22:51   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от voicel Посмотреть сообщение
Но тут другая проблема, никак не возвращается адрес функции из моей dll в приложение.
Код:
extern "C"
declspec(dllexport)
void query(const char *arg)
{
	mysql_query(&sql, arg);
}
counter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает DLL kromol Win Api 2 17.06.2011 00:53
Bass.Dll в Delphi XE не работает. werrey Мультимедиа в Delphi 5 12.06.2011 11:34
Формула не работает в *.dll technik4 Общие вопросы Delphi 3 04.03.2011 17:09
Не работает DLL Crivel Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.04.2009 12:27
Не работает dll Манжосов Денис :) Общие вопросы Delphi 1 06.01.2009 10:35