You are not logged in.
Pages: 1
Возник вопрос , а каким образом в Visual Cpp можно создать DLL , в которой можно использовать DllEntryPoint ? ( такая возможность есть в Delphi и Borland cpp builder )
Offline
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
Offline
Offline
Всем привет!
Кто нибудь помогите мне, надо поменять в файле d3d9.dll
следующее:
[deleted]
и чтобы видео заставку показывал, а не сразу титульный рисунок
Заранее спасибо!!!
отредактированный файл отправте пожалуйста на мой ящик kss-90@mail.ru или тут поместите где-нибудь!
Давайте не будем опускаться до открытого воровства чужих работ! С такими вопросами нужно обращаться к автору. Пока предупреждение.
Last edited by Seemann (04-03-2008 14:47)
Offline
Тут я что неправильно сделал:
1. Создаю в Delphi 7 File => New => Other => Dll Wizard
2. В uses добавил ShareMem первым
3. Написал тест-функцию
function TestNum: Integer; begin Result:=777; end;
и рассположил её до [c]begin end.[/c] .
4. Скопировал в папку CLEO.
5. Написал тест-скрипт
if 0AA2: 0@ = load_library "CLEO\TestLib.dll" // IF and SET then if 0AA4: 1@ = get_proc_address "TestNum" library 0@ // IF and SET then 0AA7: call_function 1@ num_params 0 pop 0 2@ 0513: show_text_box_1number 'DOLLAR' number 2@ end 0AA3: free_library 0@ end
6. Запускаю SA и запускаю скрипт - выскакивает ошибка:
GTA: San Andreas: gta_sa.exe - Ошибка приложения
Инструкция по адресу "0x00000000" обратилась к памяти по адресу "0x00000000". Память не может быть "read"."OK" -- завершение приложения
"Отмена" -- отладка приложения
Нажимаю OK - игра продолжается как ни в чём ни бывало.
PS В настроках SB строки Как есть
[small][/small]
Offline
Добавь еще перед begin end. блок
exports TestNum;
т.е. укажи компилятору, что функцию нужно экспортировать.
http://delphi.about.com/od/windowsshell … basics.htm
ShareMem можно (даже нужно) убрать. Этот модуль нужен только, если ты передаешь в функцию DLL из EXE строковый параметр типа string. Строки лучше передавать через указатели (PChar), тогда и ShareMem не понадобится.
Offline
Как передать в DLL функцию строку из скрипта? Я пробовал по-разному, но не получается.
[small][/small]
Offline
Саму строку (последовательность символов) ты, конечно, передать не сможешь, но можно передать указатель на начало строки. Высчитываешь адрес строки (как в примерах с опкодом 0900) и передаешь этот адрес в функцию. Соответствующий аргумент функции должен быть объявлен с типом PChar (если речь о Delphi) или аналогичным ему в других языках программирования (char *, например).
Offline
{$CLEO} 0000: while true if 0AB0: key_pressed 77 then 0AB1: call_scm_func @BeepFunc 1 1234 end wait 0 end :BeepFunc if 0AA2: 2@ = load_library "CLEO\lib.dll" // IF and SET then if 0AA4: 3@ = get_proc_address "Test" library 2@ // IF and SET then // 0AA5: call 3@ num_params 1 pop 1 0@ 1@ 0AA7: call_function 3@ num_params 1 pop 1 0@ 1@ 0513: show_text_box_1number 'NUMBER' number 1@ // ~k~~VEHICLE_ENTER_EXIT~ Use Slot Machine $~1~ end 0AA3: free_library 2@ end 0AB2: ret 0
function Test(N: Integer): Integer; export; begin Result:=N; end;
Функция возвращает то, что передали(int). На экране тестбокс выходит не 1234 а непонятная длинная цифра. В SA формат Integer нестандарный? Или я неправильно делаю?
Last edited by VcSaJen (29-08-2008 08:01)
[small][/small]
Offline
library lib; function Test(N: Integer): Integer; stdcall; begin Result := N; end; exports Test; begin end.
0AA7: call_function 3@ num_params 1 pop 0 0@ 1@
stdcall функции сами очищают стек.
Last edited by Fess (29-08-2008 08:55)
Offline
Всё нормально, передаются справо на лево Integer и Float параметры, функция возвращает нормально Integer, но не возвращает Float! (Вместо него возвращает ноль)
Как можно возвратить Float?
[small][/small]
Offline
Какой тип используешь для Float? Single?
Offline
Да, Single.
Я же говорю, дробные передаются, но не возвращаются.
[small][/small]
Offline
Все равно ничего не выходит у меня с 0AA4: 1@ = get_proc_address "PlaySND" library 0@ // IF and SET...
Написал ТОЧНО рабочую самую простую библиотеку с 1 функцией, которая благополучно вызывается из exe, но в scm не могу получить адрес этой функции.
Вот код dll:
library Missille; uses mmsystem, SysUtils, Classes, windows; {$r sounds.res} procedure PlaySND; begin PlaySound('SND1', GetModuleHandle('Missile'), SND_RESOURCE or SND_ASYNC); end; exports PlaySND; begin end.
Код exe на всякий случай.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; procedure PlaySND; external 'Missile'; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin playsnd; end; end.
При нажатии на кнопку воспроизводится звук запуска ракеты, в общем - все как положено...
А в scm:
{$CLEO} 0000: if 0AAB: file_exists "Missile.dll" then gosub @main end 0A93: end_custom_thread :main while true wait 0 if 0ab0: 0xD then if 0AA2: 0@ = load_library "Missile.dll" // IF and SET then if 0AA4: 1@ = get_proc_address "PlaySND" library 0@ // IF and SET then 03E5: show_text_box 'HELP101' 0AA5: call 1@ num_params 0 pop 0 end end end end return
До строчки 03E5: show_text_box 'HELP101' никогда не доходит. (выше все работает - я проверял). То есть не удается получить адрес функции PlaySND... Кто-нибудь подскажите, что я не так делаю?
Offline
Все получилось=).В настройках СБ отключил преобразование строк к верхнему регистру и все заработало. Значит 0AA4 принимает РЕГИСТРОЗАВИСИМУЮ строку.
Появился новый вопрос (знаю, что надоел уже:D): Как засечь из dll, что в игре открыто меню? А-то коряво получается - звук проигрывается в меню. Надо считать память? И можно ли как-то приостановить воспроизведение апишного PlaySound?
Offline
http://msdn.microsoft.com/en-us/library … S.85).aspx
Фунция GetProcAddr, которую как раз и вызывает опкод 0AA4, работает с учетом регистра.
The spelling and case of a function name pointed to by lpProcName must be identical to that in the EXPORTS statement of the source DLL's module-definition (.def) file.
Сам опкод только передает параметры в эту функцию.
Как засечь из dll, что в игре открыто меню?
посмотри исходники моего мп3 плеера на сайте CLEO. Там в комментариях должен быть нужный адрес
//0x00BA67A4 - SA menu shown flag
И можно ли как-то приостановить воспроизведение апишного PlaySound?
http://msdn.microsoft.com/en-us/library/aa909766.aspx
вызови PlaySound повторно с первым параметром nil
Еще в тему
http://gtamaps.net/forum/index.php?showtopic=11969
Offline
вызови PlaySound повторно с первым параметром nil
в этом случае воспроизведение остановится и начать его с места остановки нельзя будет... И еще плохо, что нельзя одновременно воспроизводить несколько звуков с этим PlaySound... Потенциал у него небольшой, наверно надо искать другие способы воспроизводить звуки.
Offline
посмотри тему на мапсе, которую я сказал, там использовалась библиотека bass.dll
Offline
эх, потом разбираться с этими компонентами буду. Щас времени нет. Пусть пока PlaySound будет. А все-таки в чем принцип отслеживания изменений значений по определенным адресам из dll? Я посмотрел, там какие-то хуки - мозги с ними сломаешь.=(
Offline
Pages: 1