Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Access violation at address "бла-бла-бла", Вызов функции из DLL MSVS в приложен BCB 
V
    Опции темы
GraNit
Дата 1.8.2014, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

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



Здравствуйте, уважаеммые господа-коллеги!

Осваиваю динамическую загрузку DLL, а точнее приходится осваивать. Столкнулся с непонятной ситуацией. В проекте есть три функции (в дальнейшем их будет чуть больше), которые вызываются из DLL. Эта библиотека написана MSVS 2010. Первая функция открывает файл, вторая закрывает, третья делает небольшой расчет. Так при вызове третьей функции BCB дает ошибку "Access violation at address ...". Вызов третей функции абсолютно идентичен двум предыдущим. Что-то здесь не так, а что, не пойму.
Вот текст приложения на BCB:
Код

//---------------------------------------------------------------------------

#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "include\SpiceUsr.h"
//---------------------------------------------------------------------------

typedef void __cdecl (*pOpenEphe)(const char *FileName);
typedef void __cdecl (*pCloseEphe)(const char *FileName);
typedef void __cdecl (*pBodyPos)(const char *space_body);


class TForm3 : public TForm
{
__published:    // IDE-managed Components
        TMemo *Memo1;
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall initEpheFuncs();
private:    // User declarations
        HINSTANCE dllhandle;

        pOpenEphe OpenEphe;
        pCloseEphe CloseEphe;
        pBodyPos BodyPos;
public:        // User declarations
        __fastcall TForm3(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif


Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit3.h"
#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm3 *Form3;

__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::initEpheFuncs()
{
        dllhandle = LoadLibrary("MyEpheDll.dll"); 
        if(!dllhandle){
           ShowMessage("Unable to load DLL file!");
           Close();
        }else{
                OpenEphe = (pOpenEphe)GetProcAddress(dllhandle,"OpenEphe");
                if (!OpenEphe){
                        ShowMessage("Unable to get proc address of OpenEphe!");
                }

                CloseEphe = (pCloseEphe)GetProcAddress(dllhandle,"CloseEphe");
                if (!CloseEphe){
                        ShowMessage("Unable to get proc address of CloseEphe!");
                }
                BodyPos = (pBodyPos)GetProcAddress(dllhandle,"BodyPos");
                if (!BodyPos){
                        ShowMessage("Unable to get proc address of BodyPos!");
                }
        }

}

void __fastcall TForm3::FormCreate(TObject *Sender)
{
        initEpheFuncs();

        OpenEphe("c:\\HOROSCOP_EDITOR\\Ephe\\de405.bsp");
        OpenEphe("c:\\HOROSCOP_EDITOR\\Ephe\\my_frames.tf");
        OpenEphe("c:\\HOROSCOP_EDITOR\\Ephe\\my_sites.tpc");
        OpenEphe("c:\\HOROSCOP_EDITOR\\Ephe\\naif0010.tls");
        OpenEphe("c:\\HOROSCOP_EDITOR\\Ephe\\pck00010.tpc");

        BodyPos("SUN"); // Вот здесь получаю ошибку
}
//---------------------------------------------------------------------------



void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
        CloseEphe("c:\\HOROSCOP_EDITOR\\Ephe\\pck00010.tpc");
        CloseEphe("c:\\HOROSCOP_EDITOR\\Ephe\\naif0010.tls");
        CloseEphe("c:\\HOROSCOP_EDITOR\\Ephe\\my_sites.tpc");
        CloseEphe("c:\\HOROSCOP_EDITOR\\Ephe\\my_frames.tf");
        CloseEphe("c:\\HOROSCOP_EDITOR\\Ephe\\de405.bsp");
        FreeLibrary(dllhandle);
}


Это сообщение отредактировал(а) GraNit - 1.8.2014, 09:42
PM MAIL   Вверх
_zorn_
Дата 1.8.2014, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 12



Цитата(GraNit @  1.8.2014,  17:40 Найти цитируемый пост)
// Вот здесь получаю ошибку

А все должны себе представить код BodyPos ?
Мне нравится, я вам тут накидал хрен пойми чего. Разберитесь почему у меня ошибка.
Access Violation - обращение к неинициализированной памяти.
В делфи с KOL, например, выход за пределы массива. 
Вобщем без листинга BodyPos  иди в пень.
PM MAIL   Вверх
GraNit
Дата 4.8.2014, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

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



_zorn_, чтож так грубо то? Мы с вами не друзья-братья. Попрошу вас выдерживать хоть какие-то рамки приличия. Я понимаю, что в стране где блатная романтика считается нормой, ждать культурного отношения к незнакомому человеку не приходится, но на даном форуме существуют правила, которые обязывают относиться к собеседнику с уважением и оскорбления, на сколько я понимаю, наказываются. Я обратился к людям с уважением и ни одной своей фразой не дал повода меня куда-то там посылать.
Теперь к вашей просьбе, уважаемый _zorn_, вот текст вызываемой функции:

Код

#define MYDLL_API __declspec(dllexport)

#ifdef __cplusplus
    extern "C" {
#endif

#include "include\SpiceUsr.h"

                void MYDLL_API __cdecl OpenEphe(char *FileName);
        void MYDLL_API __cdecl CloseEphe(char *FileName);
        void MYDLL_API __cdecl BodyPos(char *space_body);

#ifdef __cplusplus
    }
#endif


Код

#include "ephe.h"
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include <Windows.h>
#include <io.h>
#include <WinUser.h>
#include <stdio.h>

#pragma comment(lib,"cspice.lib")
#pragma comment(lib,"csupport.lib")

BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}

    void MYDLL_API __cdecl OpenEphe(char *FileName)
    {
        // Проверим существование файла
        if ( _access_s((const char*) FileName,0) == 0 ){
            // Если есть, то откроем
            furnsh_c((const char*)FileName);
        }else{
            // Иначе нужно показать что файл не существует.
            int msgboxID = MessageBoxA(NULL,(LPCSTR) "File not found!" ,(LPCSTR) "Error", MB_OK);
        }
        return;
    }

    void MYDLL_API __cdecl CloseEphe(char *FileName){
        unload_c((const char*) FileName);
    }

    void MYDLL_API __cdecl BodyPos(char *space_body){

        int msgboxID = MessageBoxA(NULL,(LPCSTR) space_body,(LPCSTR) "Info", MB_OK);
    return;
    }
    


По идее все должно работать. Файлы же открываются и закрываются (смотрел ProcessExplorer-ом), только BodyPos не хочет показать передаваемый параметр, вернее вообще не хочет вызываться.
PM MAIL   Вверх
xvr
Дата 4.8.2014, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Криминала не видно. Посмотрите отладчиком со стороны VS где ломается. Для этого в свойствах проекта с вашей DLL на вкладке Configuration Properties -> Debugging в поле ввода Command пропишите *.exe (вместе с путем), полученный в BCB. Далее ставите точку останова в функции BodyPos и запускаете проект с отладкой (F5). Проект конечно надо собрать в Debug режиме.

В принципе вместо *.exe можно прописать и сам BCB, тогда сможете отлаживать сразу и BCB программу и DLL в VS  smile 

PM MAIL   Вверх
GraNit
Дата 5.8.2014, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

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



xvr, сделал как вы сказали. Получил выходные данные в окне вывода, но самой отладки (такой к какой я привык) у меня не вышло, т.е. не было трассировки как в BCB. Снова я где-то протормозил, видать  smile 
Привожу выходные данные:
Код

"HoroscopEditor.exe": Загружено: "C:\HOROSCOP_EDITOR\HoroscopEditor.exe", Двоичный код не был построен с отладочной информацией.
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\ntdll.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\kernel32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\KernelBase.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\advapi32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\msvcrt.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\sechost.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\rpcrt4.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\sspicli.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\cryptbase.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\version.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\comctl32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\gdi32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\user32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\lpk.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\usp10.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\oleaut32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\ole32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\imm32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\msctf.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\uxtheme.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Program Files (x86)\TeamViewer\Version9\tv_w32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\shell32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\shlwapi.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\dwmapi.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll", Невозможно найти или открыть файл PDB
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\clbcatq.dll", Невозможно найти или открыть файл PDB
Поток 'Поток Win32' (0x26e8) завершился с кодом 0 (0x0).
"HoroscopEditor.exe": Загружено: "C:\HOROSCOP_EDITOR\MyEpheDll.dll", Символы загружены.
"HoroscopEditor.exe": Загружено: "C:\Windows\SysWOW64\msvcr100d.dll", Символы загружены.
Первый этап обработки исключения в "0x004068eb" в "HoroscopEditor.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000300".
"HoroscopEditor.exe": Выгружено: "C:\HOROSCOP_EDITOR\MyEpheDll.dll"
"HoroscopEditor.exe": Выгружено: "C:\Windows\SysWOW64\msvcr100d.dll"
Поток 'Поток Win32' (0x2b78) завершился с кодом 0 (0x0).
Поток 'Поток Win32' (0x290c) завершился с кодом 0 (0x0).
Поток 'Поток Win32' (0x988) завершился с кодом 0 (0x0).
Поток 'Поток Win32' (0x24c8) завершился с кодом 0 (0x0).
Программа "[11172] HoroscopEditor.exe: Машинный код" завершилась с кодом 0 (0x0).


Точку останова ставил на MessageBoxA. Мне кажется, что BCB даже в функцию попасть не может. Мож с BCB что-то не так?
PM MAIL   Вверх
xvr
Дата 5.8.2014, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(GraNit @  5.8.2014,  05:29 Найти цитируемый пост)
Мож с BCB что-то не так? 

Похоже, что так. Запустите в BCB (с отладчиком), где сломается?

PM MAIL   Вверх
GraNit
Дата 8.8.2014, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

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



xvr, попробовал перейти на RAD Studio XE
Пришлось немного попотеть с приведением строк в ANSI, там по умолчанию все в Юникоде.
Но проблема осталась не решенной, на том же месте, та же ошибка.  smile
Значит все таки не в BCB было дело.

Странно, функция BodyPos по данным RAD Studio лежит по адресу :53900008, однако вызов идет :004775А7, если я ничего не путаю. Почему так? Значит мы получаем не правильный адрес? А почему GetProcAddress может его получить не правильно?

Это сообщение отредактировал(а) GraNit - 8.8.2014, 13:11
PM MAIL   Вверх
xvr
Дата 8.8.2014, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(GraNit @  8.8.2014,  13:01 Найти цитируемый пост)
Значит все таки не в BCB было дело.

Ну не в нем самом, а в том, что он нагенерил. А RAD Studio XE это все тот же BCB (просто под новым именем)  smile 

Цитата(GraNit @  8.8.2014,  13:01 Найти цитируемый пост)
Странно, функция BodyPos по данным RAD Studio лежит по адресу :53900008, однако вызов идет :004775А7

Похоже это место, откуда вызывали. До BodyPos исполнение просто не дошло. 

Запустите программу в RAD Studio и посмотрите отладчиком, где она упала.

Сорцы у вас точно соответствуют тому, что вы привели в предыдущих постах?


Цитата(GraNit @  8.8.2014,  13:01 Найти цитируемый пост)
А почему GetProcAddress может его получить не правильно?

А посмотрите, что он вернул (опять же отладчиком)

PM MAIL   Вверх
GraNit
Дата 9.8.2014, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

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



xvr, а он все еще не понимает lib-ы MSVS?
Было бы замечательно просто прикрутить lib файл и работать без dll.
PM MAIL   Вверх
xvr
Дата 9.8.2014, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(GraNit @  9.8.2014,  05:29 Найти цитируемый пост)
xvr, а он все еще не понимает lib-ы MSVS?

Не в курсе, увы. Раньше не понимал  smile 

PM MAIL   Вверх
GraNit
Дата 11.8.2014, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

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



Блин, нашел ошибку. Сам идиот. Перед вызовом функции я инициализировал массив (из примера я его изъял, посчитал не важным моментом). Так инициализировал 3 элемента, а обращаюсь к 4-му. Вот и всё. 
Приношу свои извинения за невнимательность.
Уважаемому xvr особая благодарность!

P.S. Для информации. RAD Studio XE не понимает lib-ы от MSVS. Попробовал.

Это сообщение отредактировал(а) GraNit - 11.8.2014, 10:03
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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