#1 16-01-2008 08:05

Alexander
Registered: 19-08-2006
Posts: 184
Website

Создание DLL в VC++

Возник вопрос , а каким образом в Visual Cpp можно создать DLL , в которой можно использовать DllEntryPoint ? ( такая возможность есть в Delphi и Borland cpp builder crazy)

Offline

#2 16-01-2008 11:32

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Создание DLL в VC++

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

#3 17-01-2008 21:00

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Создание DLL в VC++

Опа , если объявлять так , то работает .
Спасибо .

Offline

#4 03-03-2008 19:20

cooolleer
Registered: 03-03-2008
Posts: 5

Re: Создание DLL в VC++

Всем привет!

Кто нибудь помогите мне, надо поменять в файле d3d9.dll
следующее:
[deleted]


и чтобы видео заставку показывал, а не сразу титульный рисунок


Заранее спасибо!!!

отредактированный файл  отправте пожалуйста на мой ящик kss-90@mail.ru или тут поместите где-нибудь!


Давайте не будем опускаться до открытого воровства чужих работ! С такими вопросами нужно обращаться к автору. Пока предупреждение.

Last edited by Seemann (04-03-2008 14:47)

Offline

#5 04-07-2008 05:40

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Создание DLL в VC++

Тут я что неправильно сделал:
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

#6 04-07-2008 05:58

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

Re: Создание DLL в VC++

Добавь еще перед begin end. блок

exports
TestNum;

т.е. укажи компилятору, что функцию нужно экспортировать.

http://delphi.about.com/od/windowsshell … basics.htm

ShareMem можно (даже нужно) убрать. Этот модуль нужен только, если ты передаешь в функцию DLL из EXE строковый параметр типа string. Строки лучше передавать через указатели (PChar), тогда и ShareMem не понадобится.

Offline

#7 30-07-2008 07:34

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Создание DLL в VC++

Как передать в DLL функцию строку из скрипта? Я пробовал по-разному, но не получается.


[small][/small]

Offline

#8 30-07-2008 09:38

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

Re: Создание DLL в VC++

Саму строку (последовательность символов) ты, конечно, передать не сможешь, но можно передать указатель на начало строки. Высчитываешь адрес строки (как в примерах с опкодом 0900) и передаешь этот адрес в функцию. Соответствующий аргумент функции должен быть объявлен с типом PChar (если речь о Delphi) или аналогичным ему в других языках программирования (char *, например).

Offline

#9 29-08-2008 07:56

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Создание DLL в VC++

{$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

#10 29-08-2008 08:53

Fess
Registered: 29-04-2008
Posts: 62

Re: Создание DLL в VC++

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

#11 17-12-2008 04:59

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Создание DLL в VC++

Всё нормально, передаются справо на лево Integer и Float параметры, функция возвращает нормально Integer, но не возвращает Float! (Вместо него возвращает ноль)
Как можно возвратить Float?


[small][/small]

Offline

#12 17-12-2008 10:08

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

Re: Создание DLL в VC++

Какой тип используешь для Float? Single?

Offline

#13 17-12-2008 10:13

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Создание DLL в VC++

Да, Single.
Я же говорю, дробные передаются, но не возвращаются.


[small][/small]

Offline

#14 03-05-2009 20:56

Alien
Registered: 12-10-2008
Posts: 564

Re: Создание DLL в VC++

Все равно ничего не выходит у меня с 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

#15 04-05-2009 10:45

Alien
Registered: 12-10-2008
Posts: 564

Re: Создание DLL в VC++

Все получилось=).В настройках СБ отключил преобразование строк к верхнему регистру и все заработало. Значит 0AA4 принимает РЕГИСТРОЗАВИСИМУЮ строку.
Появился новый вопрос (знаю, что надоел уже:D): Как засечь из dll, что в игре открыто меню? А-то коряво получается - звук проигрывается в меню. Надо считать память? И можно ли как-то приостановить воспроизведение апишного PlaySound?

Offline

#16 04-05-2009 11:17

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

Re: Создание DLL в VC++

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

#17 04-05-2009 12:27

Alien
Registered: 12-10-2008
Posts: 564

Re: Создание DLL в VC++

вызови PlaySound повторно с первым параметром nil

в этом случае воспроизведение остановится и начать его с места остановки нельзя будет... И еще плохо, что нельзя одновременно воспроизводить несколько звуков с этим PlaySound... Потенциал у него небольшой, наверно надо искать другие способы воспроизводить звуки.

Offline

#18 04-05-2009 20:31

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

Re: Создание DLL в VC++

посмотри тему на мапсе, которую я сказал, там использовалась библиотека bass.dll

Offline

#19 05-05-2009 11:12

Alien
Registered: 12-10-2008
Posts: 564

Re: Создание DLL в VC++

эх, потом разбираться с этими компонентами буду. Щас времени нет. Пусть пока PlaySound будет. А все-таки в чем принцип отслеживания изменений значений по определенным адресам из dll? Я посмотрел, там какие-то хуки - мозги с ними сломаешь.=(

Offline

Board footer

Powered by FluxBB