-
Notifications
You must be signed in to change notification settings - Fork 0
/
unit1.pas
139 lines (106 loc) · 2.94 KB
/
unit1.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//V2M player in Lazarus
//Code: MilkDrop2077
//with Magic_h2001.dll
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
Windows;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
public
end;
type // need Windows in uses
TV2mPlayFile = procedure(FName: PChar; AuRepeat: Boolean); stdcall;
TV2mPlayResource = procedure(hInst:Longint; ResName, ResType:Pchar; AuRepeat:Bool); stdcall;
TV2mGetTime = function :Longint; stdcall;
TV2mStop = procedure() stdcall;
var
Form1: TForm1;
V2mPlayFile: TV2mPlayFile;
V2mPlayResource: TV2mPlayResource;
V2mGetTime: TV2mGetTime;
V2mStop: TV2mStop;
V2mDLLHandle: HMODULE;
Target : string;
Res : TResourceStream;
implementation
{$R *.lfm}
{$R V2mRes.res}
// LOAD V2M DLL dynamically + GetProcedureAddress
procedure LoadV2mDLLfromRes;
begin
V2mDLLHandle := LoadLibrary(Pchar(Target));
if V2mDLLHandle <> NilHandle then begin
V2mPlayResource := TV2mPlayResource(GetProcedureAddress(V2mDLLHandle, 'V2mPlayResource')); //V2mPlayResource
V2mGetTime := TV2mGetTime(GetProcedureAddress(V2mDLLHandle, 'V2mGetTime')); //V2mGetTime
V2mStop := TV2mStop(GetProcedureAddress(V2mDLLHandle, 'V2mStop')); //V2mStop
end;
end;
// UNLOAD V2M DLL + free Procedures
procedure UnloadV2mDLLfromRes;
begin
if V2mDLLHandle <> NilHandle then begin
UnloadLibrary(V2mDLLHandle);
V2mPlayResource := nil;
V2mGetTime := nil;
V2mStop := nil;
end;
end;
// V2mPlayResource
procedure CallV2mPlayResource(hInst:Longint; ResName, ResType:Pchar; AuRepeat:Bool);
begin
V2mPlayResource(hInst, ResName, ResType, AuRepeat);
end;
// V2mGetTime
function CallV2mGetTime: Longint;
begin
Result := V2mGetTime();
end;
// V2mStop
procedure CallV2mStop();
begin
V2mStop();
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Target := GetTempDir;
if Target[Length(Target)] <> '\' then Target := Target + '\';
Target := Target+'V2M.dll';
Try
res := TResourceStream.Create(hinstance, 'V2M', 'V2mfile');
res.SaveToFile(Target);
res.Free;
Except on EFCreateError do end;
// LOAD V2M DLL
LoadV2mDLLfromRes;
// PLAY V2M file from RES
CallV2mPlayResource(hInstance,Pchar(101),'V2mFile',False);
Timer1.Enabled:= true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:= false;
Label2.Caption:= '';
CallV2mStop();
UnloadV2mDLLfromRes;
DeleteFile(Pchar(Target+'V2M.dll'));
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label2.Caption:= inttostr(CallV2mGetTime);
end;
end.