PDA

Просмотр полной версии : окно из dll


Elecktron
03.02.2012, 08:23
хочу встроить в dll окно для вывода некоторой информации.
при добавлении в проект формы (File->New->Form), даже не добавляя какой-либо код в тело dll, клиент вылетает с предложением отправить отчет "дяде биллу".

пробовал добавить

int somefunc()
{
TForm1* form = new TForm1( 0 );
form->ShowModal();
delete form;
}

somefunc() гарантировано вызывается клиентом.
окно появляется. процесс загрузки останавливается. закрываю. грузится дальше, появляется рамка окна л2 и сразу отчет "дяде биллу"...

клиент ц4
библиотека dsetup

куда копнуть, или как правильно создать окно?

Guzh
03.02.2012, 09:53
я создаю в отдельном потоке,на делфе так:

procedure TNewThreadradar.Execute;
begin
Application.Initialize;
Application.CreateForm(TFRadarPiu, FRadarPiu);
Application.Run;
end;

mira
03.02.2012, 10:12
В коде длл чето нето походу.
Если ты создаеш форму в dllmain а инжектиш лоадером тоже плохая манера влекущая кучу "неуловимых" ошибок.

Добавлено через 9 минут
я создаю в отдельном потоке,на делфе так:

procedure TNewThreadradar.Execute;
begin
Application.Initialize;
Application.CreateForm(TFRadarPiu, FRadarPiu);
Application.Run;
end;

угу. Дочерние потоки не могут быть исполнены пока инициализация всех длл не завершитса. В основном же, обращение к апи любых длл кроме kernel32 может повлеч краш. Так как они могут быть на тот момент недогружены.

для потока л2 еще хуже, он останетса в оконной процедуре формы и дальше ниче не выполнит

Sherman
03.02.2012, 13:17
procedure DLLEntryPoint(dwReason: DWORD); export;
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
//.......
SetForm:=TSetForm.Create(nil);
SetForm.MemoLog.Clear;
//.......
end;
DLL_PROCESS_DETACH:
begin

end;
end
end;


Хз, у меня такой код работал, на событиях контролов были прикручены вызовы функций клиента. Единственное, это dll ка прикрученная к engine.dll с помощью PETools, а не на лету внедряемая.

mira
03.02.2012, 14:44
Ну там ошибка в длл гдето. Также непонятно чем вызываетса эта somefunc

Elecktron
03.02.2012, 23:10
я пишу dsetup.dll
функция под номером 11 в любом случае вызывается клиентом.
вызывать форму пробовал и в 11 функции, и в DllEntryPoint, и в InitThread.
в лучшем случае форма появляется и останавливается загрузка, после закрытия формы ошибка...

без формы все работает: адднетворк перехватывается, пакеты обрабатываются, в лог файл пишет.
но стоит только добавить форму в проект (File->New->Form) и сразу облом.
пробовал переделать под многопоточную dll - то же самое.

на данный момент проблема не в вызове формы, а в работе клиента с dll в которой форма.

Sherman
03.02.2012, 23:43
пробовал добавить

int somefunc()
{
TForm1* form = new TForm1( 0 );
form->ShowModal();
delete form;
}



Остановка всех очередей сообщений и потоков приложения из которого это вызвано. Если я не ошибаюсь. Покажи форму немодально.

Elecktron
04.02.2012, 01:06
сделал так:

int okno()
{
TForm1* form = new TForm1( 0 );
form->Show();
delete form;
return 0;
}

вызываю okno(); в InitThread.

появляется форма, продолжается загрузка клиента, но при появлении рамки основного окна - предлагает отправить отчет "дяде биллу".

если поставить вызов okno(); после while (0==GetModuleHandleA("fire.dll")) Sleep(100);
окно не появляется, с ошибкой вылетает...

Sherman
04.02.2012, 01:14
delete form; нафига? Вроде как у формы есть метод Form->Destroy();

Ты dsetup.dll своим вариантом что ле заменил? Если да, то косяк в самой реализации ваще... Какая то из ф-ций сбоит.

Elecktron
04.02.2012, 05:44
если и есть косяк в реализации, то только в том, что добавляет автоматом борланд.
в своем коде я уверен. без формы все работает.
а вот что не так, я не понял.

mira
04.02.2012, 11:35
посматри какие длл тащит за собой проект с формой и без)

Sherman
04.02.2012, 22:35
Да у меня ваще подозрение что кто то не реализовал все ф-ции оригинальной dsetup.dll , а просто болванку с 11 ю ф-циями пустыми забибенил...., и ждет что после этого клиент будет запускаться.
Выкладывай код своей dll... будем зырить.

xkor
06.02.2012, 11:01
Sherman, и как тогда эта болванка бы работала без формы?
ЗЫ когда блин коментирующие начнут тему читать полностью, задалбывать начинает что больше половины ответов в любой теме написаны с явным не прочтением или недопониманием предыдущих...

Sherman
06.02.2012, 14:52
xkor, аффтар и говорит о том что - неработает.
Я говорю о том, что человек создал проект dll-ки, назвал его dsetup , описал в нем экспортируемые функции с именами-как-в-оригинале, но пустые. В 11 ой ф-ции вызывает создание окна. Положил эту dll в папку System (клиента), и запустил клиент. ЕСТЕСТВЕННО У НЕГО КЛИЕНТ БУДЕТ КРАШИТСЯ....

ЗЫ это как раз подходит под текст топикстартера:
даже не добавляя какой-либо код в тело dll, клиент вылетает с предложением отправить отчет "дяде биллу".
Так что я то тред с самого начала читал... когда афтар только запостил. :cool:

Топикстартер, если ход моих мыслей был неверен, поправь...

supernewbie
06.02.2012, 21:27
Sherman,
без формы все работает.

Sherman
07.02.2012, 01:11
Sherman,

Яхз, афтар где то тупит, но консперируетсо.


С ФОРМОЙ ВСЕ РАБОТАЕТ

На скрине клиент, окно созданное в 11 функции самопальной dsetup.dll и MessageBox вызываемый обработчиком нажатия кнопки Push me

В аттаче архив с проектом, в архиве папка Win32\Release\dsetup.dll для неверующих.

При желании переведи на насильный код, со сцылкой на афтора ))) т.е. миня.... )))

ЗЫ
если и есть косяк в реализации, то только в том, что добавляет автоматом борланд.
Негоже гнать на создателя АК-47, когда стреляешь себе в висок.

mira
07.02.2012, 10:15
С этой длл виснет загрузка и загружаетса гг. Кнопка на формочке тыркаетса тока если клиент кританет.

сделал в отдельном потоке окно исчезло (видимо иза того что поток завершилса сразу)

Добавлено через 2 минуты
За дллку пасибо :) гг-килл добавь тока :)

Sherman
07.02.2012, 12:43
С этой длл виснет загрузка и загружаетса гг. Кнопка на формочке тыркаетса тока если клиент кританет.

сделал в отдельном потоке окно исчезло (видимо иза того что поток завершилса сразу)

Добавлено через 2 минуты
За дллку пасибо :) гг-килл добавь тока :)

Хз, у меня все ровно, на С4 клиенте. Тыкай в кнопку, хоть обтыкайся, клиент не критует. Клиент заходит в игру без заморочек (elmore.ru). Правда у меня клиент патченый на nosleep от Fury и без ГГ.

mira
07.02.2012, 12:56
На хай файф проверял.

начиная с интерлюда минимум патч от гг fyyri собственно в dsetup и находитса.

у меня на хф загрузка встает с твоей длл на логотипе. Форма есть но она также шоковая. Не че не нажимаетса на ней и она висит как мертвая даже не перерисовывая канву.

Sherman
07.02.2012, 16:04
На хай файф проверял.

начиная с интерлюда минимум патч от гг fyyri собственно в dsetup и находитса.

у меня на хф загрузка встает с твоей длл на логотипе. Форма есть но она также шоковая. Не че не нажимаетса на ней и она висит как мертвая даже не перерисовывая канву.

Видимотвой клиент еще какую то ф-цию из dsetup пользует.... напиши заглушки с мессаджбоксами , так отследишь какую именно...

Gracia Final (valhalla-age) тоже прожовывает мой dsetup, тока тама защита в этой либе, в клиент работает,но в игруху не заходит естественно)

Номы отвлеклись от темы.... )))

mira
07.02.2012, 16:27
Да нет не отвлеклись.
Убрав форму из либы клиент стартанул загрузив мне гг и запустив его процесс :)

Sherman
07.02.2012, 17:02
Ты не ТС )))

mira
07.02.2012, 17:34
хз мб дело в том что я перекомпилировал либу в D7 у тя как я понял какаято более старшая

Sherman
07.02.2012, 17:39
хз мб дело в том что я перекомпилировал либу в D7 у тя как я понял какаято более старшая

Delphi XE2 Update 3

Ты не ТС
Я имел ввиду что ты не Топикстартер, который ниасилил вставить в длл форму )

mira
07.02.2012, 17:52
ну вот у меня перекомпиленая твоя длл в седьмой делфе дала теже результаты что у поциента

Elecktron
07.02.2012, 18:57
еще раз повторяю:
ДЛЛ БЕЗ ФОРМЫ РАБОТАЕТ.
после того как я добавляю форму, клиент начинает критовать.
я не исключаю варианта неправильного вызова формы.
пишу на шестом билдере. (делфи практически не знаю...)
геймгвард отключается в коре, гугль знает как.

зы: а можно патчик nosleep?

Sherman
07.02.2012, 20:52
Electron - ты настырен, но например я не телепат. От тебя нет ни единого слова о том что дало бы возможность сэмулировать подобную тебе ситуацию. Ни версия хроник, ни исходник чего либо.

nosleep не приделах, т.к. в клиенте Gracia Final на котором я тестировал его не было.

ну вот у меня перекомпиленая твоя длл в седьмой делфе дала теже результаты что у поциента

Гиде скачать клиент твоих хроник?

На таком клиенте еще проверил....
http://coderx.ru/attachment.php?attachmentid=2605&stc=1&d=1328648766
Короче на С4, Gracia Final и Freya работает, просто подкладывал свою длл вместо той которая с клиентами идет.

mira
08.02.2012, 02:20
у меня тоже работает твоя дллка просто пришлось ждать там видимо ГГ грузил свой долбаный дистрибутив. и потом выдал что обнаружен взлом)

Sherman
08.02.2012, 02:38
у меня тоже работает твоя дллка просто пришлось ждать там видимо ГГ грузил свой долбаный дистрибутив. и потом выдал что обнаружен взлом)
Но это уже проблема несовсем клиента и длл с формой, а защиты...
Тоесть обращаясь к топикстартеру - показыл бы исходники, решили бы проблему... А так тока истеричный капс что : "ДЛЛ БЕЗ ФОРМЫ РАБОТАЕТ" (с)

ЗЫ. ПАФОС-ПАФОС-ПАФОС-ПАФОС

ЗЫЗЫ. To mira - в отдельном потоке форму делать есть смысл только для того что бы избежать задержек, описанных тобой, когда ГГ тащит что то, и на время форма и клиент замирают. Но отдельный поток возможно будет череват замутами с синхрониацией потоков. а исходников клиента ладвы как бе нет....
Хотя, по принципу формы в DLL я себе делал автосдавалку манора.... там на кнопке висело создание Thread с отправкой пакета сдачи манора.... вроди клиент не крашился.... выдерживал вызовы раз в 0.10 сек даже.

Elecktron
10.02.2012, 22:58
клиент ц4 (пробовал и с грацией), сервер - локально поднятая джава.
вот рабочая длл
2607
а вот я добавил форму
2608

Sherman
11.02.2012, 04:30
клиент ц4 (пробовал и с грацией), сервер - локально поднятая джава.
вот рабочая длл
2607
а вот я добавил форму
2608

1. Суть проблемы в том, что у тебя после компиляции индекс функции
DirectXSetupGetVersion становится не 11 а хзкакой. Связано это не с Борландом, а с С++ вцелом....
Как побеждать написано в ПРУФ 1 (http://www.rsdn.ru/article/devtools/bcbdll.xml)
Я не насильник, не асилил...
2. Что бы было все ок, эта функция должна возвращать значение неравное 0... плюс в твоем проекте параметры передаваемые ф-ции обьявлены как DWORD, а по ПРУФ 2 (http://doc.51windows.net/Directx9_SDK/?url=/directx9_sdk/setup/reference/functions/directxsetupgetversion.htm) должны передаваться PDWORD ...

ЗЫ через 6 часов попыток....
Я тоже пока что не смог добиться от С++ XE2 того, что бы dsetup.dll не критовала клиент. Но повторюсь, я не насильник...
Реально, как только в проект добавляется информация о использовании VCL - сразу клиент критует.

Elecktron
11.02.2012, 05:50
1. номер функции никуда не девается.
длл с формой, строка из олли:
Names in DSETUP, item 91
Address = 04611554
Section = .text
Type = Export
Name = DirectXSetupGetVersion
Comments = Ordinal = #11


2. работает даже так:
DWORD __stdcall DirectXSetupGetVersion(DWORD pdwVersion, DWORD dwRevision)
{
/*pdwVersion = 0x00040009;
dwRevision = 0x00000387;*/
return 0;
}

зы: в первом вложении полностью работоспособный пример.

Sherman
11.02.2012, 11:04
Первое вложение у тебя и не качается.

Elecktron
11.02.2012, 14:20
перезалил :)
2610
а насчет vcl - таки походу с реализацией где-то косяк...

Sherman
11.02.2012, 16:03
Мдя.... тоже никак не удается каменный цветок.. как только VCL в dsetup скомпиленной в С++, клиент краш.

Elecktron
12.02.2012, 00:42
встречал информацию о том, что нужно разруливать Application->Handle и Dll->Handle.
но как это сделать, я не разобрался...
делфи начиная с 7 вроде как умеет самостоятельно решать, а с++ нет..

Elecktron
21.03.2012, 06:29
проблема кроется намного глубже. подозреваю что она не решаема.
она где-то между кривизной реализации vcl библиотеки борландовского с++ и сделанным через "одно место" клиентом л2.
да и хендлы тут абсолютно не причем. потому как окно из длл вполне успешно показывается во время прогруза клиента.
и вылет происходит вне зависимости от показа окошка. стоит просто добавить код формы в проэкт не инициализируя ее - и все, "бобик сдох".. :(

Sherman
21.03.2012, 22:30
маленький EPIC WIN Паскакалей.....:)

Elecktron
14.12.2012, 18:32
маленький EPIC WIN Паскакалей.....:)

сегодня реализовал на MS VC++
так что это EPIC FAIL BCB...

Sherman
15.12.2012, 15:06
сегодня реализовал на MS VC++
так что это EPIC FAIL BCB...

Выложи исходник, хочется посмотреть в чем причина была. СиБилдер кстати да, наиболее возможно это борландовский косяк вообще.

Elecktron
16.12.2012, 03:16
просто добавил в длл проэкт форму
и в настройках проекта включил CLR

#include "Form1.h"

using namespace dsetup;

int __stdcall DirectXDeviceDriverSetupA() {return 0;}
int __stdcall DirectXDeviceDriverSetupW() {return 0;}
int __stdcall DirectXRegisterApplicationA() {return 0;}
int __stdcall DirectXRegisterApplicationW() {return 0;}
int __stdcall DirectXSetupA() {return 0;}
int __stdcall DirectXSetupIsJapan() {return 0;}
int __stdcall DirectXSetupIsJapanNec() {return 0;}
int __stdcall DirectXSetupW() {return 0;}
int __stdcall DirectXUnRegisterApplication() {return 0;}
int __stdcall DirectXSetupSetCallback() {return 0;}
DWORD __stdcall DirectXSetupGetVersion(DWORD pdwVersion, DWORD dwRevision)
{ //для "капризного" клиента
pdwVersion = 0x00040009;
dwRevision = 0x00000387;
Form1^ Form = gcnew Form1;
Form->Show();
return 0;
}

вот где-то так..

Elecktron
27.04.2013, 02:15
и полезли вопросы...
"окошко" в Form1.cpp и Form1.h
это фрагмент файла dsetup.cpp
DWORD __stdcall DirectXSetupGetVersion(DWORD pdwVersion, DWORD dwRevision)
{
Form1^ Form = gcnew Form1;
Form->Show();
//как здесь обращаться к компонентам формы? (например listBox)
return 0;
}

пробовал по-разному..
dsetup::Form1::listBox1 - дальше не знает, и выдает ошибку

using namespace dsetup; - естественно прописан (задается в Form1.h)
using namespace System::Windows::Forms; - тоже пробовал..

в обработчике нажатия кнопки нормально работает:
dsetup::Form1::listBox1->Items->Add("qwe");

из dllmain.cpp вообще никуда не могу достучаться - при добавлении "using namespase" лезут ошибки..
а завязка-то на нее идет..

проэкт представляет из себя сложный гибрид dll и windows form.

с борландом было все просто - для обращения к какому-либо компоненту использовать "Form1->".
а тут мистика какая-то... или же я "не умею их готовить" :)

Elecktron
29.04.2013, 04:16
похоже на то, что такой вариант не жизнеспособен...
а в делфи большой "fail" с врапперами и тому подобными приколами... :(