Но я, не могу узнать, работает оно или нет. Поскольку, не могу скомпилировать реальную DLL.
Произошла странность:
В виде приложения код DLL работает, а в виде библиотеки - выдает ошибку:
[Error] MyDll.dpr(53): Incompatible types: 'method pointer and regular procedure'
#pas
library MyDll;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, midi;
{$R *.res}
type
TEFunc = procedure(n:PChar) of object;
procedure DoMidiInData(const aDeviceIndex: integer; const aStatus, aData1, aData2: byte);
var
lHour, lMin, lSec, lMSec: Word;
cha1:PChar;
func:TEFunc;
begin
// skip active sensing signals from keyboard
if aStatus = $FE then Exit;
try
// print the message log
DecodeTime( now, lHour, lMin, lSec, lMSec );
cha1:=PChar(Format( '[%.2d:%.2d:%.2d:%.3d] %s: <Status> %.2x, <Data 1> %.2x <Data 2> %.2x',
[ lHour, lMin, lSec, lMSec,
MidiInput.Devices[aDeviceIndex],
aStatus,
aData1,
aData2 ] ));
func(cha1); //возвращает значение в HiAsm
finally
end;
end;
procedure Mess(func:TEFunc); //создание списка входов
var cha:PChar;
begin
cha:= PChar(Midiinput.Devices[0]);
func(cha);
// MidiInput.Open(0); // выбор входа
// MidiOutput.Open(2); //выбор выхода
MidiInput.OnMidiData := DoMidiInData; //Старт работы (тут указывается функция, на которую возвращать данные)
end;
exports
Mess;
begin
end.
А необходимый midi.pas вот:
code_20702.txt
------------ Дoбавленo в 08.59:
В виде обычного приложения, вот это компилируется (хотя это тоже самое)
#pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Midi, StdCtrls, SyncObjs, CheckLst;
type
TForm1 = class(TForm)
memLog: TMemo;
lbxInputDevices: TCheckListBox;
lbxOutputDevices: TCheckListBox;
procedure FormCreate(Sender: TObject);
private
public
procedure DoMidiInData( const aDeviceIndex: integer; const aStatus, aData1, aData2: byte );
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DoMidiInData(const aDeviceIndex: integer; const aStatus,
aData1, aData2: byte);
var
i: integer;
lHour, lMin, lSec, lMSec: Word;
begin
// skip active sensing signals from keyboard
if aStatus = $FE then Exit;
memLog.Lines.BeginUpdate;
try
// print the message log
DecodeTime( now, lHour, lMin, lSec, lMSec );
memLog.Lines.Insert( 0, Format( '[%.2d:%.2d:%.2d:%.3d] %s: <Status> %.2x, <Data 1> %.2x <Data 2> %.2x',
[ lHour, lMin, lSec, lMSec,
MidiInput.Devices[aDeviceIndex],
aStatus,
aData1,
aData2 ] ));
finally
memLog.Lines.EndUpdate;
end;
end;
procedure TForm1.FormCreate(Sender: TObject); //Создание формы
begin
// MidiInput.Open( 0 ); // выбор входа
// MidiOutput.Open( 2); //выбор выхода
lbxInputDevices.Items.Assign( MidiInput.Devices ); //создание списка входов
lbxOutputDevices.Items.Assign( MidiOutput.Devices );//создание списка выходов
MidiInput.OnMidiData := DoMidiInData; //Старт работы (тут указывается функция, на которую возвращать данные)
end;
end.