You are not logged in.
Pages: 1
Сравнительно недавно начал изучать Delphi, и у меня возникли некоторые вопросы по нему.
Вопрос №1.
Нужно с помощью DLL прочитать значение из INI-файла и передать его в скрипт. Функция постоянно возвращает дефолт. В чём ошибка?
Исходник DLL`ки:
uses SysUtils, Classes, IniFiles; function ReadINI(pcSection, pcParameter: PChar): Integer; stdcall; var IniFile: TIniFile; sSection: String; sParameter: String; begin sSection := String(pcSection); sParameter := String(pcParameter); IniFile := TIniFile.Create('G:\test.INI'); Result := IniFile.ReadInteger(sSection, sParameter, 0); IniFile.Free; end; exports ReadINI;
Исходник скрипта:
thread 'DLLTest' wait 5000 0A99: chdir 0 :Section 0662: NOP 'General' :Parameter 0662: NOP 'Number1' 0A9F: 10@ = current_thread_pointer 10@ += 16 0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0 VAR 10@: Integer 11@: Integer END 11@ = 10@ 10@ -= @Section 10@ += 2 11@ -= @Parameter 11@ += 2 if 0AA2: 0@ = load_library "CLEO\INIReader.dll" then if 0AA4: 1@ = get_proc_address 'ReadINI' library 0@ then 0AA7: call_function 1@ num_params 2 pop 0 10@ 11@ 2@ 01E4: show_text_1number_lowpriority GXT 'NUMBER' number 2@ time 2000 flag 1 else 01E4: show_text_1number_lowpriority GXT 'NUMBER' number -1 time 2000 flag 1 end 0AA3: free_library 0@ else 01E4: show_text_1number_lowpriority GXT 'NUMBER' number -2 time 2000 flag 1 end end_thread
Вопрос №2.
Как из DLL определить папку, в которой она находится?
Вопрос №3.
Как в Delphi создать тип float и перевести в него переменную типа String или PChar?
Offline
эх дельфи нет под рукой, и не программировал уже фиг знает сколько но попробую ответить по памяти, поэтому заранее извиняюсь
1. Насколько я понимаю, ошибка в использовании типа PChar и приведении его в string.
sSection := String(pcSection);
sParameter := String(pcParameter);
это неправильно. В IniFile.ReadInteger нужно подставить либо сами pcXXXXX (дельфи автоматически переведет их в строку), либо разименовать указатель, используя символ ^ (pcSection^ - как то так, более подробно в справке)
2. ParamStr(0) вернет путь к файлу программы. Не уверен, что для dll подойдет, но собственно большего и не надо (можно использовать пути относительно ехе файла)
3. var _f: double; end;
s := FloatToStr(_f....)
Offline
По второму. Нужно использовать API-функцию GetModuleFileNameEx.
GetModuleFileNameEx(GetCurrentProcess(), GetModuleHandle("CLEO.asi"), buffer, sizeof(buffer));
Вместо "CLEO.asi" надо писать имя своей dll.
Offline
Спасибо! Тут у меня ещё один вопрос возник:
Если не ошибаюсь, типу Float в GTA соответствует типу Single в Delphi. Тогда почему при передачи значения в скрипт всегда получаю нуль?
Offline
Если из скрипта ты пытаешься получить результат опкодом 0AA7, то он возвращает только целочисленные значения. Для получения значений с плавающей запятой используй опкод 0AE9 из CLEO 4.
Offline
Ещё раз спасибо!
Offline
Ещё несколько вопросов.
Надо написать плагин (в основном просто для теста) на Дельфи.
1) То есть скрипт не будет подключать библиотеку отдельно, а она будет запускаться с игрой сама?
2) Формат .asi это просто переименованные .dll или нужно как-то конвертировать?
3) Плагин должен создать опкоды для Sanny Builder. Их надо будет просто прописать в файл опкодов и кинуть .asi в корень игры?
4) Прошу привести простейший пример .asi и способ вызова созданных им опкодов.
И уже выйдет неплохой мануал по созданию плагинов, имхо.
Offline
Я плагины для ГТАшки не создаю, но на пару вопросов всё-же ответить могу:
1) Угадал.
2) Переименовать и ничего более.
В справке CLEO 4 есть тема создания своих опкодов.
Вот маленький и простенький плагин реального времени в игре. Исходник прилагается. Может что-нибудь интересное там найдёшь.
[You must login to view hidden text.]
Offline
Pages: 1