Просмотр полной версии : окно из 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
куда копнуть, или как правильно создать окно?
я создаю в отдельном потоке,на делфе так:
procedure TNewThreadradar.Execute;
begin
Application.Initialize;
Application.CreateForm(TFRadarPiu, FRadarPiu);
Application.Run;
end;
В коде длл чето нето походу.
Если ты создаеш форму в dllmain а инжектиш лоадером тоже плохая манера влекущая кучу "неуловимых" ошибок.
Добавлено через 9 минут
я создаю в отдельном потоке,на делфе так:
procedure TNewThreadradar.Execute;
begin
Application.Initialize;
Application.CreateForm(TFRadarPiu, FRadarPiu);
Application.Run;
end;
угу. Дочерние потоки не могут быть исполнены пока инициализация всех длл не завершитса. В основном же, обращение к апи любых длл кроме kernel32 может повлеч краш. Так как они могут быть на тот момент недогружены.
для потока л2 еще хуже, он останетса в оконной процедуре формы и дальше ниче не выполнит
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, а не на лету внедряемая.
Ну там ошибка в длл гдето. Также непонятно чем вызываетса эта somefunc
Elecktron
03.02.2012, 23:10
я пишу dsetup.dll
функция под номером 11 в любом случае вызывается клиентом.
вызывать форму пробовал и в 11 функции, и в DllEntryPoint, и в InitThread.
в лучшем случае форма появляется и останавливается загрузка, после закрытия формы ошибка...
без формы все работает: адднетворк перехватывается, пакеты обрабатываются, в лог файл пишет.
но стоит только добавить форму в проект (File->New->Form) и сразу облом.
пробовал переделать под многопоточную dll - то же самое.
на данный момент проблема не в вызове формы, а в работе клиента с dll в которой форма.
пробовал добавить
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);
окно не появляется, с ошибкой вылетает...
delete form; нафига? Вроде как у формы есть метод Form->Destroy();
Ты dsetup.dll своим вариантом что ле заменил? Если да, то косяк в самой реализации ваще... Какая то из ф-ций сбоит.
Elecktron
04.02.2012, 05:44
если и есть косяк в реализации, то только в том, что добавляет автоматом борланд.
в своем коде я уверен. без формы все работает.
а вот что не так, я не понял.
посматри какие длл тащит за собой проект с формой и без)
Да у меня ваще подозрение что кто то не реализовал все ф-ции оригинальной dsetup.dll , а просто болванку с 11 ю ф-циями пустыми забибенил...., и ждет что после этого клиент будет запускаться.
Выкладывай код своей dll... будем зырить.
Sherman, и как тогда эта болванка бы работала без формы?
ЗЫ когда блин коментирующие начнут тему читать полностью, задалбывать начинает что больше половины ответов в любой теме написаны с явным не прочтением или недопониманием предыдущих...
xkor, аффтар и говорит о том что - неработает.
Я говорю о том, что человек создал проект dll-ки, назвал его dsetup , описал в нем экспортируемые функции с именами-как-в-оригинале, но пустые. В 11 ой ф-ции вызывает создание окна. Положил эту dll в папку System (клиента), и запустил клиент. ЕСТЕСТВЕННО У НЕГО КЛИЕНТ БУДЕТ КРАШИТСЯ....
ЗЫ это как раз подходит под текст топикстартера:
даже не добавляя какой-либо код в тело dll, клиент вылетает с предложением отправить отчет "дяде биллу".
Так что я то тред с самого начала читал... когда афтар только запостил. :cool:
Топикстартер, если ход моих мыслей был неверен, поправь...
supernewbie
06.02.2012, 21:27
Sherman,
без формы все работает.
Sherman,
Яхз, афтар где то тупит, но консперируетсо.
С ФОРМОЙ ВСЕ РАБОТАЕТ
На скрине клиент, окно созданное в 11 функции самопальной dsetup.dll и MessageBox вызываемый обработчиком нажатия кнопки Push me
В аттаче архив с проектом, в архиве папка Win32\Release\dsetup.dll для неверующих.
При желании переведи на насильный код, со сцылкой на афтора ))) т.е. миня.... )))
ЗЫ
если и есть косяк в реализации, то только в том, что добавляет автоматом борланд.
Негоже гнать на создателя АК-47, когда стреляешь себе в висок.
С этой длл виснет загрузка и загружаетса гг. Кнопка на формочке тыркаетса тока если клиент кританет.
сделал в отдельном потоке окно исчезло (видимо иза того что поток завершилса сразу)
Добавлено через 2 минуты
За дллку пасибо :) гг-килл добавь тока :)
С этой длл виснет загрузка и загружаетса гг. Кнопка на формочке тыркаетса тока если клиент кританет.
сделал в отдельном потоке окно исчезло (видимо иза того что поток завершилса сразу)
Добавлено через 2 минуты
За дллку пасибо :) гг-килл добавь тока :)
Хз, у меня все ровно, на С4 клиенте. Тыкай в кнопку, хоть обтыкайся, клиент не критует. Клиент заходит в игру без заморочек (elmore.ru). Правда у меня клиент патченый на nosleep от Fury и без ГГ.
На хай файф проверял.
начиная с интерлюда минимум патч от гг fyyri собственно в dsetup и находитса.
у меня на хф загрузка встает с твоей длл на логотипе. Форма есть но она также шоковая. Не че не нажимаетса на ней и она висит как мертвая даже не перерисовывая канву.
На хай файф проверял.
начиная с интерлюда минимум патч от гг fyyri собственно в dsetup и находитса.
у меня на хф загрузка встает с твоей длл на логотипе. Форма есть но она также шоковая. Не че не нажимаетса на ней и она висит как мертвая даже не перерисовывая канву.
Видимотвой клиент еще какую то ф-цию из dsetup пользует.... напиши заглушки с мессаджбоксами , так отследишь какую именно...
Gracia Final (valhalla-age) тоже прожовывает мой dsetup, тока тама защита в этой либе, в клиент работает,но в игруху не заходит естественно)
Номы отвлеклись от темы.... )))
Да нет не отвлеклись.
Убрав форму из либы клиент стартанул загрузив мне гг и запустив его процесс :)
хз мб дело в том что я перекомпилировал либу в D7 у тя как я понял какаято более старшая
хз мб дело в том что я перекомпилировал либу в D7 у тя как я понял какаято более старшая
Delphi XE2 Update 3
Ты не ТС
Я имел ввиду что ты не Топикстартер, который ниасилил вставить в длл форму )
ну вот у меня перекомпиленая твоя длл в седьмой делфе дала теже результаты что у поциента
Elecktron
07.02.2012, 18:57
еще раз повторяю:
ДЛЛ БЕЗ ФОРМЫ РАБОТАЕТ.
после того как я добавляю форму, клиент начинает критовать.
я не исключаю варианта неправильного вызова формы.
пишу на шестом билдере. (делфи практически не знаю...)
геймгвард отключается в коре, гугль знает как.
зы: а можно патчик nosleep?
Electron - ты настырен, но например я не телепат. От тебя нет ни единого слова о том что дало бы возможность сэмулировать подобную тебе ситуацию. Ни версия хроник, ни исходник чего либо.
nosleep не приделах, т.к. в клиенте Gracia Final на котором я тестировал его не было.
ну вот у меня перекомпиленая твоя длл в седьмой делфе дала теже результаты что у поциента
Гиде скачать клиент твоих хроник?
На таком клиенте еще проверил....
http://coderx.ru/attachment.php?attachmentid=2605&stc=1&d=1328648766
Короче на С4, Gracia Final и Freya работает, просто подкладывал свою длл вместо той которая с клиентами идет.
у меня тоже работает твоя дллка просто пришлось ждать там видимо ГГ грузил свой долбаный дистрибутив. и потом выдал что обнаружен взлом)
у меня тоже работает твоя дллка просто пришлось ждать там видимо ГГ грузил свой долбаный дистрибутив. и потом выдал что обнаружен взлом)
Но это уже проблема несовсем клиента и длл с формой, а защиты...
Тоесть обращаясь к топикстартеру - показыл бы исходники, решили бы проблему... А так тока истеричный капс что : "ДЛЛ БЕЗ ФОРМЫ РАБОТАЕТ" (с)
ЗЫ. ПАФОС-ПАФОС-ПАФОС-ПАФОС
ЗЫЗЫ. To mira - в отдельном потоке форму делать есть смысл только для того что бы избежать задержек, описанных тобой, когда ГГ тащит что то, и на время форма и клиент замирают. Но отдельный поток возможно будет череват замутами с синхрониацией потоков. а исходников клиента ладвы как бе нет....
Хотя, по принципу формы в DLL я себе делал автосдавалку манора.... там на кнопке висело создание Thread с отправкой пакета сдачи манора.... вроди клиент не крашился.... выдерживал вызовы раз в 0.10 сек даже.
Elecktron
10.02.2012, 22:58
клиент ц4 (пробовал и с грацией), сервер - локально поднятая джава.
вот рабочая длл
2607
а вот я добавил форму
2608
клиент ц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;
}
зы: в первом вложении полностью работоспособный пример.
Первое вложение у тебя и не качается.
Elecktron
11.02.2012, 14:20
перезалил :)
2610
а насчет vcl - таки походу с реализацией где-то косяк...
Мдя.... тоже никак не удается каменный цветок.. как только VCL в dsetup скомпиленной в С++, клиент краш.
Elecktron
12.02.2012, 00:42
встречал информацию о том, что нужно разруливать Application->Handle и Dll->Handle.
но как это сделать, я не разобрался...
делфи начиная с 7 вроде как умеет самостоятельно решать, а с++ нет..
Elecktron
21.03.2012, 06:29
проблема кроется намного глубже. подозреваю что она не решаема.
она где-то между кривизной реализации vcl библиотеки борландовского с++ и сделанным через "одно место" клиентом л2.
да и хендлы тут абсолютно не причем. потому как окно из длл вполне успешно показывается во время прогруза клиента.
и вылет происходит вне зависимости от показа окошка. стоит просто добавить код формы в проэкт не инициализируя ее - и все, "бобик сдох".. :(
маленький EPIC WIN Паскакалей.....:)
Elecktron
14.12.2012, 18:32
маленький EPIC WIN Паскакалей.....:)
сегодня реализовал на MS VC++
так что это EPIC FAIL BCB...
сегодня реализовал на 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" с врапперами и тому подобными приколами... :(
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot