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