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@
end6. Запускаю 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 0function 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