![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дочерние окна [D7, Win2k, WinXP]
IntruderLab © (2008-05-29 11:03:00)Вопрос вобщем-то вот в чем, в программе дочерние окна содержаться в dll, при запуске программы в winXP все работает прекрасно, при запуске win2000 в момент вызова процедуры открытия дочернего окна вылетает ошибка. Как с этим бороться?
Сергей М. (2008-05-29 14:36:00) [21]
> это мы уже проходили в прошлой серии
В прошлой серии мы также "проходили" и спецификаторы сошлашений о вызовах, он у тебя как был так и остался stdcall, хотя в той серии до хрипоты долдонили про осмысленностьего указания) ..
> Result := LongInt(frmShowDocuments);
И про это тоже долдонили)
Но, похоже, все это как о стенку горох - ты опять влупил это приведение типа, совершенно не понимая зачем оно тебе нужно и нужно ли вообще.
IntruderLab (2008-05-29 14:31:00) [22]Конечно :) это мы уже проходили в прошлой серии :) в ХР то работает.
Сергей М. (2008-05-29 14:28:00) [23]Вызывающий и вызываемый модули собраны c установленной оцией использования ран-тайм пакетов ?
IntruderLab (2008-05-29 14:25:00) [24]Хорошо, только я немного другую функция распишу, эта работает, вобщем не работают все вызовы немодальных форм.
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:04:00) [25]Ну хорошо.
Где реализована ф-ция SearchClient - в той самой твоей dll ?
Покажи код загрузки этой dll и все обращения к ее функциям , включая SearchClient
IntruderLab (2008-05-29 14:00:00) [26]
> Сергей М. © (29.05.08 13:55) [16]
>
>
> > Короче, как я понял, при вызове дочерней формы из dll,
> вообще
> > еще до обращения к коду
>
>
> Не надо галдать, надо взять в руки отладчик, найти конкретную
> строчку и показать нам соответствующий фрагмент кода, к
> контексте которого фигурирует эта строчка.
>
Это все понятно :) только win2000 у клиента в другом городе :) сейчас вынь2000 поставлю.
Сергей М. (2008-05-29 13:55:00) [27]
> Короче, как я понял, при вызове дочерней формы из dll, вообще
> еще до обращения к коду
Не надо галдать, надо взять в руки отладчик, найти конкретнуюстрочку и показать нам соответствующий фрагмент кода, к контексте которого фигурирует эта строчка.
{RASkov} (2008-05-29 13:54:00) [28]> [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
IntruderLab (2008-05-29 13:44:00) [29]И еще встречный вопрос, можно ссылочку где про пакеты можно почитать
IntruderLab (2008-05-29 13:40:00) [30]
> Palladin © (29.05.08 13:34) [12]
>
>
> > IntruderLab (29.05.08 11:40) [9]
>
> в каком месте ты bpl используешь если черным по белому писано
>
> > в программе дочерние окна содержаться в dll
>
Я про это и спросил, формы тоже в bpl засовывать? Просто я галочку Включить BPL пакеты выставил. Но все же остается вопрос, почему в XP работает?
Palladin (2008-05-29 13:34:00) [31]
> IntruderLab (29.05.08 11:40) [9]
в каком месте ты bpl используешь если черным по белому писано
> в программе дочерние окна содержаться в dll
IntruderLab (2008-05-29 13:34:00) [32]Короче, как я понял, при вызове дочерней формы из dll, вообще еще до обращения к коду (типа в Init), самое смешное в WinXP все работает, ошибочка только в Win2000.
Сергей М. (2008-05-29 13:30:00) [33]на какой из приведенных строк происходит падение ?
IntruderLab (2008-05-29 11:40:00) [34]Дак и так BPL использую, я же и говорю что все работает в WinXP, но не работает в Win2000, или я все-таки что - то не понимаю (DLL в BPL как-то преобразовывать надо?, чет я запутался)
Palladin (2008-05-29 11:36:00) [35]...использовать не dll, а bpl
IntruderLab (2008-05-29 11:31:00) [36]
> Palladin © (29.05.08 11:29) [6]
>
> о сколько раз твердили миру...
МИР слушает :) в чем траблы могут быть?
Palladin (2008-05-29 11:29:00) [37]о сколько раз твердили миру...
IntruderLab (2008-05-29 11:20:00) [38]ccon - как понимаете внешняя функция, ошибка не в коде программы а в реализации дочерних окон в MDI апликациях в win2000, может быть как - то компилятор перенасторить
IntruderLab (2008-05-29 11:16:00) [39]
> TForumHelp © (29.05.08 11:12) [2]
>
> Если вылетает что-то типа:
> Access violation at address блаблабла in module 'блабла.
> exe'. Read of address блаблабла
> значит, что ты неправильно подключаешь библиотеку или сделал
> где-то FreeLibrary();
>
> гони код - разберемся - все ситуации перебирать не стану.
>
Нет вылетает именно приложение вызвало ошибку и будет закрыто. Создан журнал, ессно, что в журнале ничего нет. А по поводу ошибки в модулях - это уже в прошлом, сейчас обычно такое не вылетает :)
IntruderLab (2008-05-29 11:15:00) [40]Ну для примера могу привести :)
//************************************************************
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