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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2009, 22:20   #1
Smertnik
 
Регистрация: 13.04.2008
Сообщений: 6
По умолчанию Повторный вызов функции из dll

Здравствуйте! Возникла следующая проблема:
В программе вызываются функции из подключенных динамически dll. Перед непосредственным вызовом функции грузится нужная длл, выполянется функция, после чего dll сразу освобождается. (dll написана мною)

модификатор вызова WINAPI:
typedef void (WINAPI cfunc(TDiagramBlock *));

(пробовал модификаторы __cdecl, __import, __stdcall...)

при первом вызове функции все отлично работает, но при повторном ошибка Invalid Pointer Operation... где-то падает указатель.

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

Программа строит диаграммы из блоков и расчитывает их... то есть сами функции блоков храняться в длл... При нажатии на кнопку Расчет программа расчитывает дерево блоков для каждого вызвывая функцию из длл... первый расчет работает отлично....при повторном ошибки(((((

Копал по всему интернету, ничего вразумительного не нашел...(((
Smertnik вне форума Ответить с цитированием
Старый 15.05.2009, 01:54   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

А код посмотреть можно?
Вы, наверное, где-то создаете какой-то объект и не удаляете его. При повторном запуске вы снова его создаете.
Хотя чего гадать на кофейной гуще? Код в студию!
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 15.05.2009, 16:57   #3
Smertnik
 
Регистрация: 13.04.2008
Сообщений: 6
По умолчанию

На самом деле проект огромный... вот тогда пример функции, в которой вызывается сама функция dll:

Код:
typedef void   (WINAPI  OutPutF(String, TDiagramBlock *));
//...
BOOL __fastcall OutPutFunc(String Params, TDiagramBlock * B, String DllName)
{
        HINSTANCE hDll = NULL;
        OutPutF * COUF = NULL;
        hDll = LoadLibrary(DllName.c_str());
        if (hDll != NULL)
        {
                COUF = (OutPutF *)GetProcAddress   ((HMODULE)hDll,"_OutPutFunc");
                if (COUF != NULL) COUF(Params, B);
                else Application->MessageBoxA("Не обнаружен адрес DLL Функции!","Ошибка!", MB_OK | MB_ICONERROR);
                FreeLibrary(hDll);
                return true;
        }
        Application->MessageBoxA("Ошибка загрузки DLL!","Ошибка!",MB_OK | MB_ICONERROR);
        return false;
}
Строка Params всегда передается корректно! Насчет блока TDiagramBlock * B тоже сомнений впринципе нету...то есть параметры все впорядке.
Вот функция в dll:

Код:
void OutPutFunc(String Str, TDiagramBlock * B)
{
    if ((Str != NULL) && (B != NULL))
    {
        if (B->TextCells->Count == 0) B->TextCells->Add();
        B->TextCells->Items[0]->Alignment =  taLeftJustify;
        B->TextCells->Items[0]->Left = 20;
        B->TextCells->Items[0]->Top = 33;
        B->TextCells->Items[0]->Width = 60;
        B->TextCells->Items[0]->Height = 15;
        B->TextCells->Items[0]->Text = Str;
    }
}
И хедер в dll:

Код:
#ifndef _OUTPUTBLOCK_H
#define _OUTPUTBLOCK_H

#ifdef __DLL__
# define DLL_EI __declspec(dllexport)
#else
# define DLL_EI __declspec(dllimport)
#endif

#include <atDiagram.hpp>

extern "C" void DLL_EI OutPutFunc(String, TDiagramBlock * B);
#endif
Здесь я привел только одну функцию...на самом деле в каждой dll их минимум по 3.

А и главный проект и dll компилируются без Runtime packeges. ( А также без Use dynamic RTL и Use debug libraries)
Smertnik вне форума Ответить с цитированием
Старый 15.05.2009, 17:03   #4
Smertnik
 
Регистрация: 13.04.2008
Сообщений: 6
По умолчанию

А и вот еще какой момент... если допустим использовать функцию из dll в которую ничего не передается и которая просто возвращает значение int то все работает корректно...без падений... пробовал передавать в dll по ссылочке TDiagramBlock * &B и String & Params...не падает при закрытии программы....но все еще падает при повторном вызове функции расчета....
А также вот еще какой факт: если строку Params не менять...то программа падает при втором расчете сразу, если же внести изменения в нее, то программа не падает при расчетах, но падает при выходе из программы!!!!!

Последний раз редактировалось Smertnik; 15.05.2009 в 17:16.
Smertnik вне форума Ответить с цитированием
Старый 15.05.2009, 17:23   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Здается мне что параметр B неверно передается.
Что будет если дважды передать один и тот же параметр и теми же значениями?
Вот это
Цитата:
if ((Str != NULL) && (B != NULL))
не верно срабатывает. имхо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.05.2009, 22:18   #6
Smertnik
 
Регистрация: 13.04.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Здается мне что параметр B неверно передается.
Что будет если дважды передать один и тот же параметр и теми же значениями?
Вот это

не верно срабатывает. имхо.
Я эту проверочку дописал уже после того как нашел ошибку ... и без проверки ругался тоже... я тоже думаю что дело в указателе на объект класса TDiagramBlock.... но мне просто обязательно надо передавать его в длл...
Smertnik вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и вызов библиотеки dll DM_bite Помощь студентам 3 15.06.2010 12:47
Вызов произвольной функции из DLL Роман Радер Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 31 05.03.2010 22:35
Вызов функции из dll-ки VVVadim Общие вопросы Delphi 2 28.04.2009 10:37
Вызов функции MarSeON PHP 2 01.08.2008 20:22
вызов из dll не ShowModal. Roof Общие вопросы Delphi 7 25.07.2008 15:22