Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.9.115] |
|
Сообщ.
#1
,
|
|
|
Простой тест: в главной программе загружаются две DLL. В первой DLL создаётся объект, а во второй - Access violation при попытке к нему обратиться.
// главная программа typedef void __stdcall (*TFuncFH)(int *fh); //... void __fastcall TForm1::button1Click(TObject *Sender) { HMODULE hnd1 = LoadLibrary(L"Lib1.dll"); HMODULE hnd2 = LoadLibrary(L"Lib2.dll"); int *fh; ((TFuncFH)GetProcAddress(hnd1, "Open_FH"))(fh); ((TFuncFH)GetProcAddress(hnd2, "Close_FH"))(fh); } // Lib1.dll extern "C" __declspec(dllexport) void __stdcall Open_FH(int *fh); //... void __stdcall Open_FH(int *fh) { fh = new int; *fh = FileOpen(L"Test.txt", fmOpenWrite); } // Lib2.dll extern "C" __declspec(dllexport) void __stdcall Close_FH(int *fh); //... void __stdcall Close_FH(int *fh) { FileClose(*fh); // Access violation !!! delete fh; } Почему так получается, несмотря на одно адресное пространство? |
Сообщ.
#2
,
|
|
|
Потому что фигню написал, потому и Access Violation.
Ты в Close_FH() передаёшь мусор. fh не инициализирован, и Open_FH() её значение тоже никак не меняет (ты видимо ожидаешь другого). А вообще люди отладчики придумали... |
Сообщ.
#3
,
|
|
|
Цитата cppasm @ А почему тогда, если создаю объект fh (fh = new int;) в главной программе, то всё работает? Какая разница, где создавать объект, если это одно адресное пространство?Ты в Close_FH() передаёшь мусор.fh не инициализирован, и Open_FH() её значение тоже никак не меняет (ты видимо ожидаешь другого). Цитата cppasm @ Здорово, а я думал, что всё правильно.Потому что фигню написал, потому и Access Violation. Цитата cppasm @ Ну да. Только не для всего, например, для XE7 C++Builder 64bit отладчик не работает, о чём честно сообщил в своё время Embarcadero. А вообще люди отладчики придумали... |
Сообщ.
#4
,
|
|
|
Цитата vlad2 @ А почему тогда, если создаю объект fh (fh = new int;) в главной программе, то всё работает? Ok, встречный вопрос: #include<stdio.h> void bug_set_3(int arg) { arg=3; } int main(int argc, char *argv[]) { int x=1; bug_set_3(x); printf("%d\n", x); return 0; } Что будет выведено и почему? Думаю это долно пролить свет на твою проблему. |
Сообщ.
#5
,
|
|
|
Цитата если создаю объект fh (fh = new int;) смотри пример: int *a = new int; a = 1; // a = 1 да? int *b = a; b = new int; b = 2; // по твоему, станет a = 2? Посмотри на свой код внимательнее. Добавлено Цитата Что будет выведено и почему? Блин, у меня более толсто получилось |
Сообщ.
#6
,
|
|
|
Цитата vlad2 @ Ну да. Только не для всего, например, для XE7 C++Builder 64bit отладчик не работает, о чём честно сообщил в своё время Embarcadero. Тогда это вечная пытка. Используй OutputDebugString + DbgView. ссылка |
Сообщ.
#7
,
|
|
|
Цитата ЫукпШ @ Используй OutputDebugString + DbgView. Я может чего не понимаю, но в чём проблема собрать в 32 бита, отладить, а потом пересобрать релиз в 64 бита? |
Сообщ.
#8
,
|
|
|
Цитата cppasm @ Цитата ЫукпШ @ Используй OutputDebugString + DbgView. Я может чего не понимаю, но в чём проблема собрать в 32 бита, отладить, а потом пересобрать релиз в 64 бита? Ни в чём. Это можно, однозначно. Но не уверен, что удобно. Между x86 и x64 могут быть тонкости на уровне исходных текстов. Поэтому всегда неплохо делать обе сборки. Обычно я так и делаю. Ограничивать одну из них я бы не стал. |
Сообщ.
#9
,
|
|
|
Цитата ЫукпШ @ Между x86 и x64 могут быть тонкости на уровне исходных текстов. Это да, но косяки как в первом посте к тонкостям не относятся и в отладчике выловить было бы просто )) |
Сообщ.
#10
,
|
|
|
Цитата cppasm @ Думаю это долно пролить свет на твою проблему. Цитата VisualProg @ Ну да, спасибо, & - ссылочку забыл.Посмотри на свой код внимательнее Цитата ЫукпШ @ Спасибо за ссылку.Используй OutputDebugString + DbgView. Цитата ЫукпШ @ Да, и не только. Дело осложняется ещё тем, что мои проги активно используют чужие 64 битные длл-ки. Между x86 и x64 могут быть тонкости на уровне исходных текстов. |
Сообщ.
#11
,
|
|
|
Цитата vlad2 @ Ну да, спасибо, & - ссылочку забыл. Да, или ссылку надо использовать, или указатель на указатель. |