Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Вниз
Дочерние окна Найти похожие ветки
← →
IntruderLab (2008-05-29 11:03) [0]Вопрос вобщем-то вот в чем, в программе дочерние окна содержаться в dll, при запуске программы в winXP все работает прекрасно, при запуске win2000 в момент вызова процедуры открытия дочернего окна вылетает ошибка. Как с этим бороться?
← →
Юрий Зотов © (2008-05-29 11:06) [1]> IntruderLab (29.05.08 11:03)
Описания ошибки нет, кода процедуры нет... что тут можно ответить? Вы полагаете, здесь экстрасенсы-телепаты собрались?
← →
TForumHelp © (2008-05-29 11:12) [2]Если вылетает что-то типа:
Access violation at address блаблабла in module "блабла.exe". Read of address блаблабла
значит, что ты неправильно подключаешь библиотеку или сделал где-то FreeLibrary();
гони код - разберемся - все ситуации перебирать не стану.
← →
IntruderLab (2008-05-29 11:15) [3]Ну для примера могу привести :)
//************************************************************
function SearchClient(slServer:TStringList):String;StdCall;
var frmSearchClient:TfrmSearchClient;i:Integer;
begin
frmSearchClient := TfrmSearchClient.Create(Application);
frmSearchClient.Position := poScreenCenter;
frmSearchClient.BorderIcons := [biSystemMenu];
frmSearchClient.rCon := TSocketConnection.Create(Application);
ccon(frmSearchClient.rCon,slServer);
frmSearchClient.ShowModal;
try
if frmSearchClient.lbClient.Items.Count > 0 then
begin
i := frmSearchClient.lbClient.ItemIndex;
Result := frmSearchClient.lbClient.Items.Strings[i]
end
else Result := " ";
finally
frmSearchClient.rCon.Free;
frmSearchClient.Free;
end;
end;
//************************************************************
FormStyle формы = fsMDIChild, у главного окна fsMDIForm, включены bpl пакеты, так что Application - общая для всего пакета. Код отрабатывает на WinXP на ура и выдает оибку в Win2000
← →
IntruderLab (2008-05-29 11:16) [4]
> TForumHelp © (29.05.08 11:12) [2]
>
> Если вылетает что-то типа:
> Access violation at address блаблабла in module "блабла.
> exe". Read of address блаблабла
> значит, что ты неправильно подключаешь библиотеку или сделал
> где-то FreeLibrary();
>
> гони код - разберемся - все ситуации перебирать не стану.
>
Нет вылетает именно приложение вызвало ошибку и будет закрыто. Создан журнал, ессно, что в журнале ничего нет. А по поводу ошибки в модулях - это уже в прошлом, сейчас обычно такое не вылетает :)
← →
IntruderLab (2008-05-29 11:20) [5]ccon - как понимаете внешняя функция, ошибка не в коде программы а в реализации дочерних окон в MDI апликациях в win2000, может быть как - то компилятор перенасторить
← →
Palladin © (2008-05-29 11:29) [6]о сколько раз твердили миру...
← →
IntruderLab (2008-05-29 11:31) [7]
> Palladin © (29.05.08 11:29) [6]
>
> о сколько раз твердили миру...
МИР слушает :) в чем траблы могут быть?
← →
Palladin © (2008-05-29 11:36) [8]...использовать не dll, а bpl
← →
IntruderLab (2008-05-29 11:40) [9]Дак и так BPL использую, я же и говорю что все работает в WinXP, но не работает в Win2000, или я все-таки что - то не понимаю (DLL в BPL как-то преобразовывать надо?, чет я запутался)
← →
Сергей М. © (2008-05-29 13:30) [10]на какой из приведенных строк происходит падение ?
← →
IntruderLab (2008-05-29 13:34) [11]Короче, как я понял, при вызове дочерней формы из dll, вообще еще до обращения к коду (типа в Init), самое смешное в WinXP все работает, ошибочка только в Win2000.
← →
Palladin © (2008-05-29 13:34) [12]
> IntruderLab (29.05.08 11:40) [9]
в каком месте ты bpl используешь если черным по белому писано
> в программе дочерние окна содержаться в dll
← →
IntruderLab (2008-05-29 13:40) [13]
> Palladin © (29.05.08 13:34) [12]
>
>
> > IntruderLab (29.05.08 11:40) [9]
>
> в каком месте ты bpl используешь если черным по белому писано
>
> > в программе дочерние окна содержаться в dll
>
Я про это и спросил, формы тоже в bpl засовывать? Просто я галочку Включить BPL пакеты выставил. Но все же остается вопрос, почему в XP работает?
← →
IntruderLab (2008-05-29 13:44) [14]И еще встречный вопрос, можно ссылочку где про пакеты можно почитать
← →
{RASkov} © (2008-05-29 13:54) [15]> [14] IntruderLab (29.05.08 13:44)
В королевстве можно поискать
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468
http://www.delphikingdom.com/asp/itemq.asp?ItemID=254
яндекс
http://yandex.ru/yandsearch?text=BPL+%2B+delphi&clid=9582
← →
Сергей М. © (2008-05-29 13:55) [16]
> Короче, как я понял, при вызове дочерней формы из dll, вообще
> еще до обращения к коду
Не надо галдать, надо взять в руки отладчик, найти конкретную строчку и показать нам соответствующий фрагмент кода, к контексте которого фигурирует эта строчка.
← →
IntruderLab (2008-05-29 14:00) [17]
> Сергей М. © (29.05.08 13:55) [16]
>
>
> > Короче, как я понял, при вызове дочерней формы из dll,
> вообще
> > еще до обращения к коду
>
>
> Не надо галдать, надо взять в руки отладчик, найти конкретную
> строчку и показать нам соответствующий фрагмент кода, к
> контексте которого фигурирует эта строчка.
>
Это все понятно :) только win2000 у клиента в другом городе :) сейчас вынь2000 поставлю.
← →
Сергей М. © (2008-05-29 14:04) [18]Ну хорошо.
Где реализована ф-ция SearchClient - в той самой твоей dll ?
Покажи код загрузки этой dll и все обращения к ее функциям , включая SearchClient
← →
IntruderLab (2008-05-29 14:25) [19]Хорошо, только я немного другую функция распишу, эта работает, вобщем не работают все вызовы немодальных форм.
dll
function ShowDocuments(slServer,slUser:TStringList):Longint;StdCall;
var frmShowDocuments:TfrmShowDocuments;cdsE:TClientDataSet;i:Integer;regFile:TRegist ry;
Layout: array[0.. KL_NAMELENGTH] of char;
begin
LoadKeyboardLayout(StrCopy(Layout,"00000419"),KLF_ACTIVATE);
frmShowDocuments := TfrmShowDocuments.Create(Application);
frmShowDocuments.slServer := TStringList.Create;
frmShowDocuments.slServer.AddStrings(slServer);
frmShowDocuments.slUser := TStringList.Create;
frmShowDocuments.slUser.AddStrings(slUser);
frmShowDocuments.WindowState := wsMaximized;
......
Result := LongInt(frmShowDocuments);
end;
//******************************************************************************
exe
procedure TfrmMain.pmnuShowDocumentsClick(Sender: TObject);
var LibHandle : THandle;
ShowDocuments : function (slServer,slUser:TStringList):Longint;StdCall;
begin
LibHandle := LoadLibrary("iHercules.dll");
if LibHandle <> 0 then
begin
@ShowDocuments := GetProcAddress(LibHandle,"ShowDocuments");
ShowDocuments(slServer,slUser);
end;
end;
//******************************************************************************
← →
Сергей М. © (2008-05-29 14:28) [20]Вызывающий и вызываемый модули собраны c установленной оцией использования ран-тайм пакетов ?
← →
IntruderLab (2008-05-29 14:31) [21]Конечно :) это мы уже проходили в прошлой серии :) в ХР то работает.
← →
Сергей М. © (2008-05-29 14:36) [22]
> это мы уже проходили в прошлой серии
В прошлой серии мы также "проходили" и спецификаторы сошлашений о вызовах, он у тебя как был так и остался stdcall, хотя в той серии до хрипоты долдонили про осмысленность его указания) ..
> Result := LongInt(frmShowDocuments);
И про это тоже долдонили)
Но, похоже, все это как о стенку горох - ты опять влупил это приведение типа, совершенно не понимая зачем оно тебе нужно и нужно ли вообще.
← →
IntruderLab (2008-05-29 14:43) [23]Сейчас тогда уберу. И получается что мне лучше все функции гда формы вызывается без ответных параметров - сделать процедурами?
← →
Сергей М. © (2008-05-29 14:52) [24]
> Сейчас тогда уберу
Зачем ?)
> получается что мне лучше все функции гда формы вызывается
> без ответных параметров - сделать процедурами?
А как будешь результат возвращать ?)
← →
IntruderLab (2008-05-29 15:07) [25]Тогда вопрос, что мне сделать?
← →
Сергей М. © (2008-05-29 15:10) [26]Смотря что тебе надо)
← →
IntruderLab (2008-05-29 15:23) [27]Мне надо, чтобы программа заработала на win2000 :) в идеале :) на ХР работет прекрасно :)
← →
Сергей М. © (2008-05-29 15:36) [28]Чтобы она заработала, надо четко осознавать происходящее в ней)
А ты до сих пор не знаешь, то ли убирать stdcall то ли не убирать, то ли функция тебе нужна то ли процедура)
← →
IntruderLab (2008-05-29 15:45) [29]Мне важно знать - почему работает в ХР и не работает в 2000
← →
Сергей М. © (2008-05-29 15:48) [30]берешь отладчик и выясняешь)
← →
IntruderLab (2008-05-29 15:48) [31]Дак отлаживать надо в 2000
← →
Сергей М. © (2008-05-29 15:54) [32]Ну так а кто за тебя это будет делать ?)
← →
IntruderLab (2008-05-29 15:56) [33]Да я и чую :) Лана, спасибо! Как разберусь напишу чего было :)
← →
Сергей М. © (2008-05-29 16:02) [34]Только прежде надо понимать, что ты хочешь и что ты для этого делаешь)
К примеру, судя по stdcall, ты вознамерился использовать свою dll в модулях, собранных в иных средах разработки, нежели Делфи или BCB. Откуда там возьмутся дельфийские MDIParent-формы - одному тебе известно)
← →
IntruderLab (2008-05-29 16:10) [35]дак а что тогда лучше safecall использовать?
← →
Сергей М. © (2008-05-29 16:15) [36]
> а что тогда лучше safecall использовать?
Лучше отложить на время строгание кода и почитать соотв.литературу.
Или хотя бы станд.справку Делфи на тему "calling conventions".
Судя по тому, что ты до сих пор не сделал этого, код был где-то содран тобой совершенно бездумно. Чему ж тут удивляться, если этот код не работает)
← →
IntruderLab (2008-05-29 16:18) [37]Код нигде не сдирал, просто в учебнике был вызов stdcall и стал применять как следствие, и все таки, из-за вызовов ошибка может в 2000 выскакивать или в чем?
← →
Сергей М. © (2008-05-29 16:20) [38]
> Код нигде не сдирал, просто в учебнике был вызов stdcall
Ну вот с учебника и содрал. Бездумно)
← →
Сергей М. © (2008-05-29 16:25) [39]
> из-за вызовов ошибка может в 2000 выскакивать или в чем?
ошибка может быть где угодно, когда ты не понимаешь что ты делаешь
← →
Сергей М. © (2008-05-29 16:32) [40]
> еще до обращения к коду (типа в Init)
Никаким Init в приведенном тобой в [19] коде даже не пахнет.
Т.е. ты предоставляешь заведомо недостоверную инф-цию и при этом ожидаешь какой-то конкретной помощи)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.141 c