Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

Дочерние окна   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.021 c
2-1211782721
Xmen
2008-05-26 10:18
2008.06.22
Как можно передать данные из текушего приложения другую и нажать


15-1210430194
SKIPtr
2008-05-10 18:36
2008.06.22
на новом компе не хотят работать некоторые программы


2-1211629231
malyar
2008-05-24 15:40
2008.06.22
как отловить момент закрытия файла


2-1211854590
emytz
2008-05-27 06:16
2008.06.22
Установка приложения по команде.


2-1212024373
AlexAA
2008-05-29 05:26
2008.06.22
Работа с камерой