#1 03-04-2010 23:26

CraZZZy-GameRRR
From: Москва
Registered: 11-08-2009
Posts: 97
Website

Несколько вопросов по Delphi

Сравнительно недавно начал изучать 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

#2 04-04-2010 01:12

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Несколько вопросов по Delphi

эх дельфи нет под рукой, и не программировал уже фиг знает сколько но попробую ответить по памяти, поэтому заранее извиняюсь

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

#3 04-04-2010 11:49

Alien
Registered: 12-10-2008
Posts: 564

Re: Несколько вопросов по Delphi

По второму. Нужно использовать API-функцию GetModuleFileNameEx.

	GetModuleFileNameEx(GetCurrentProcess(), GetModuleHandle("CLEO.asi"), buffer, sizeof(buffer));

Вместо "CLEO.asi" надо писать имя своей dll.

Offline

#4 06-04-2010 20:46

CraZZZy-GameRRR
From: Москва
Registered: 11-08-2009
Posts: 97
Website

Re: Несколько вопросов по Delphi

Спасибо! Тут у меня ещё один вопрос возник:

Если не ошибаюсь, типу Float в GTA соответствует типу Single в Delphi. Тогда почему при передачи значения в скрипт всегда получаю нуль?

Offline

#5 06-04-2010 21:12

Alien
Registered: 12-10-2008
Posts: 564

Re: Несколько вопросов по Delphi

Если из скрипта ты пытаешься получить результат опкодом 0AA7, то он возвращает только целочисленные значения. Для получения значений с плавающей запятой используй опкод 0AE9 из CLEO 4.

Offline

#6 06-04-2010 21:49

CraZZZy-GameRRR
From: Москва
Registered: 11-08-2009
Posts: 97
Website

Re: Несколько вопросов по Delphi

Ещё раз спасибо!

Offline

#7 05-05-2010 13:04

BritishColonist
Registered: 30-09-2009
Posts: 72

Re: Несколько вопросов по Delphi

Ещё несколько вопросов.
Надо написать плагин (в основном просто для теста) на Дельфи.
1) То есть скрипт не будет подключать библиотеку отдельно, а она будет запускаться с игрой сама?
2) Формат .asi это просто переименованные .dll или нужно как-то конвертировать?
3) Плагин должен создать опкоды для Sanny Builder. Их надо будет просто прописать в файл опкодов и кинуть .asi в корень игры?
4) Прошу привести простейший пример .asi и способ вызова созданных им опкодов.
И уже выйдет неплохой мануал по созданию плагинов, имхо.

Offline

#8 05-05-2010 21:17

CraZZZy-GameRRR
From: Москва
Registered: 11-08-2009
Posts: 97
Website

Re: Несколько вопросов по Delphi

Я плагины для ГТАшки не создаю, но на пару вопросов всё-же ответить могу:
1) Угадал. smile
2) Переименовать и ничего более.

В справке CLEO 4 есть тема создания своих опкодов.
Вот маленький и простенький плагин реального времени в игре. Исходник прилагается. Может что-нибудь интересное там найдёшь.
[You must login to view hidden text.]

Offline

Board footer

Powered by FluxBB