Поиск:

Ответ в темуСоздание новой темы Создание опроса
> vector и dll, Срочно нужна помощь 
:(
    Опции темы
artsb
Дата 17.5.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Всем привет.

У себя в программе хочу вынести большую функцию в dll.
В неё нужно передать указатель на структуру и на вектор структур. Как это правильно сделать. Выглядит она так:
Код

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include <vector.h>
#include "myList.h"
#include "settings.h"

extern "C++" __declspec(dllexport) void OpenFile(AnsiString path, Sett* settings, vector<mList>* list);
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
void OpenFile(AnsiString path, Sett* settings, vector<mList>* list)
{
//...
}

Вроде всё скомпилировалось.
А вот при вызове функции из библиотеки, пишет "Access violetion .....".
Скорее всего я что-то не так делаю smile
Подскажите.
Спасибо.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 17.5.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(artsb @  17.5.2008,  17:06 Найти цитируемый пост)
А вот при вызове функции из библиотеки, пишет "Access violetion .....".

А где сам вызов функции? Где ошибка возникает? (в этом поможет пошаговая отладка). Приведи полное сообщение об ошибке (оно может о многом сказать)
PM   Вверх
artsb
Дата 17.5.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(586 @  17.5.2008,  16:18 Найти цитируемый пост)
А где сам вызов функции? Где ошибка возникает?

Код

HINSTANCE dllh=NULL;
void (__stdcall *OpenFile)(AnsiString path, Sett* settings, vector<mList>* list);
dllh=LoadLibrary("crp.dll");
if(dllh!=NULL)
{
        OpenFile=(void (__stdcall *)(AnsiString, Sett*, vector<mList>*))GetProcAddress(dllh,"_OpenFile");
        OpenFile("myone.tpp",&settings,&list);             // <------ здесь ошибка
}
FreeLibrary(dllh);

Цитата(586 @  17.5.2008,  16:18 Найти цитируемый пост)
Приведи полное сообщение об ошибке

"Access violetion at address 00000000. Read of address 00000000."



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 17.5.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



GetProcAddress вернул нуль. Исправляй ошибки:
Цитата(artsb @  17.5.2008,  17:06 Найти цитируемый пост)
extern "C" __declspec(dllexport) void __stdcall OpenFile(AnsiString path, Sett* settings, vector<mList>* list);
Цитата(artsb @  17.5.2008,  17:42 Найти цитируемый пост)
if(dllh!=NULL)
{
        OpenFile=(void (__stdcall *)(AnsiString, Sett*, vector<mList>*))GetProcAddress(dllh,"OpenFile");
        OpenFile("myone.tpp",&settings,&list);
}

Если ошибка повторится, смотри таблицу экспорта dll. И будь готов к тому, что если будешь пользоваться разными компиляторами для exe и dll, или будешь использовать статическую RTL, вектор будет вызывать ошибки. Объекты лучше не выносить за пределы модуля.
PM   Вверх
artsb
Дата 17.5.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



На строке:
Код

extern "C" __declspec(dllexport) void __stdcall OpenFile(AnsiString path, Sett *settings, vector<mList>* list);

Пишет:
[C++ Error] openfile.cpp(29): E2337 Only one of a set of overloaded functions can be "C"

А если написать:
Код

extern "C++" __declspec(dllexport) void __stdcall OpenFile(AnsiString path, Sett *settings, vector<mList>* list);

то всё нормально. Но ошибка всё равно возникает.

Цитата(586 @  17.5.2008,  16:54 Найти цитируемый пост)
Объекты лучше не выносить за пределы модуля.

Так я же и не выношу, а передаю указатель. Или нет?

При создании dll в коментариях пишут о том, что если я использую переменные типа String или своего типа, то нужно подключить MEMMGR.LIB и тащить за собой borlndmm.dll.
Я так и сделал, но ничего не изменилось.


Это сообщение отредактировал(а) artsb - 17.5.2008, 17:11


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ama_kid
Дата 17.5.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(artsb @  17.5.2008,  17:08 Найти цитируемый пост)
Так я же и не выношу, а передаю указатель. Или нет?
Dll и Exe имеют вроде как разные сегменты данных, поэтому сомневаюсь, что твой переданный указатель будет валидным внутри библиотеки...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
586
Дата 17.5.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(artsb @  17.5.2008,  18:08 Найти цитируемый пост)
[C++ Error] openfile.cpp(29): E2337 Only one of a set of overloaded functions can be "C"

Это конфликт с паскалевской функцией OpenFile. В Си нельзя перегружать функции. Можешь использовать extern "с++", но имя этой функции в таблице экспорта будет немного другое. Или назови функцию по другому.
Цитата(artsb @  17.5.2008,  18:08 Найти цитируемый пост)
Так я же и не выношу, а передаю указатель. Или нет?

Объект изменяешь? Память будет перевыделяться, и произойдёт ошибка (если менеджер памяти у каждого модуля свой). У компиляторов реализация STL может быть разная...

Это сообщение отредактировал(а) 586 - 17.5.2008, 17:27
PM   Вверх
artsb
Дата 17.5.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(ama_kid @  17.5.2008,  17:22 Найти цитируемый пост)
Dll и Exe имеют вроде как разные сегменты данных, поэтому сомневаюсь, что твой переданный указатель будет валидным внутри библиотеки...

Как тогда быть?


Цитата(586 @  17.5.2008,  17:25 Найти цитируемый пост)
Это конфликт с паскалевской функцией OpenFile. В Си нельзя перегружать функции. Можешь использовать extern "с++", но имя этой функции в таблице экспорта будет немного другое. Или назови функцию по другому.

Я и забыл. Переименую.

Так как лучше посупить?

Добавлено через 13 минут и 51 секунду
Вот я балбес (только сильно не смейтесь smile).
Загружаю одну библиотеку, а хочу использовать функцию из другой. Во всём виновата технология "Copy-Paste". Скопировать скопировал, а название библиотеки не изменил (я сегодня ещё ону библиотеку сделал).

Спасибо всем за участие! Спасибо что так оперативно отвечаете!


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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