Page 1 sur 2
Conversion d'un code en Delphi.
Publié : dim. 29/janv./2012 11:32
par GallyHC
Bonjour,
Je voudrais une petite aide pour convertir un code en delphi. En fait c'est la librairie d'utilisation du controleur DMX de chez velleman.
Voici le code
Code : Tout sélectionner
unit K8062DM;
interface
uses
Windows, SysUtils;
procedure StartDevice; stdcall;
procedure StopDevice; stdcall;
procedure SetData(Channel: Longint ; Data: Longint); stdcall;
procedure SetChannelCount(Count: Longint); stdcall;
procedure SetShareData(address,data: Longint); stdcall;
function GetShareData(address:Longint): Longint; stdcall;
implementation
// global DLL data
var
ShareData: ^longint; // shared
hMapFile: THandle;
running:boolean = false;
const
VirtualFileName = 'ShareK8062Data';
DataSize = 2500;
// shared data read and write
procedure StartDevice; stdcall;
var h,i:integer;
begin
SetShareData(1,222);
H := WinExec(PChar('K8062E.exe'), SW_RESTORE);
end;
procedure StopDevice; stdcall;
begin
SetShareData(0,333);
end;
PROCEDURE SetChannelCount(Count: Longint); stdcall;
begin
if Count>0 then SetShareData(2,Count);
end;
PROCEDURE SetData(Channel: Longint ; Data: Longint); stdcall;
begin
if channel>0 then SetShareData(Channel+10,Data);
end;
procedure SetShareData (address,data: Longint);
var p:pointer;
ret:longint;
begin
p:=ShareData;
asm
push edi
mov edi,p
add edi,address
add edi,address
add edi,address
add edi,address
mov ret,edi
mov eax,data
mov ds:[edi],eax
pop edi
end;
end;
function GetShareData (Address:Longint): Longint; stdcall;
var p:pointer;
k:longint;
begin
p:= ShareData;
asm
push edi
mov edi,p
add edi,address
add edi,address
add edi,address
add edi,address
mov eax,ds:[edi]
mov k,eax
pop edi
end;
Result:=k;
end;
initialization
//create memory mapped file
hMapFile := CreateFileMapping ($FFFFFFFF, nil,
Page_ReadWrite, 0, DataSize, VirtualFileName);
if hMapFile = 0 then
raise Exception.Create ('Error creating memory mapped file');
// get the pointer to the actual data
ShareData := MapViewOfFile (
hMapFile, File_Map_Write, 0, 0, DataSize);
finalization
UnmapViewOfFile (ShareData);
CloseHandle (hMapFile);
end.
merci d'avance,
GallyHC
Re: Conversion d'un code en Delphi.
Publié : dim. 29/janv./2012 20:49
par GallyHC
Bonjour,
Pour ceux qui pourait me donner un coup de main la DLL de base ce trouve a l'adresse
http://www.velleman.eu/support/download ... 116&type=9 télécharger "DLL source code".
merci d'avance.
GallyHC
Re: Conversion d'un code en Delphi.
Publié : lun. 30/janv./2012 14:13
par GallyHC
Bonjour tous,
Bon voila le debut mais au niveau du code assembler je ne vois pas du tout comment faire

. Si vous voyez des erreurs je susi prenneur.
Code : Tout sélectionner
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- INITIALISATION DES DIRECTIVES COMPILEUR.
EnableASM
EnableExplicit
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- DECLARATION DES VARIABLES (VERSION).
;{ - GLOBAL VERSION
#Version = "0.0.1"
#SubVers = "RC0"
#VerDate = "01/12/2011"
Global FullVer.s
Global FullName.s = "K8062DM Library for Vellaman VM116 in PureBasic"
Global FilePath.s
If #SubVers = #NULL$
FullVer = #Version
Else
FullVer = #Version + "-" + #SubVers
EndIf
;}
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- DECLARATION DES PROCEDURES DE LA DLL.
Declare.l StartDevice()
Declare.l StopDevice()
Declare.l SetData(channel.l, ldata.l)
Declare.l SetChannelCount(count.l)
Declare GetShareData(address.l, ldata.l)
Declare.l SetShareData(address.l, ldata.l)
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- DECLARATION DES VARIABLES (GLOBALE).
Global ShareData.l
Global hMapFile.l
Global DataSize.l = 2500
Global running.b = #False
Global VirtualFileName.s = "ShareK8062Data"
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
ProcedureDLL PBOSL_VellemanVM116_Init()
;
hMapFile = CreateFileMapping_($FFFFFFFF, #Null, #PAGE_READWRITE, 0, DataSize, VirtualFileName)
If hMapFile = 0
ShareData = MapViewOfFile_(hMapFile, #FILE_MAP_WRITE, 0, 0, DataSize)
EndIf
EndProcedure
ProcedureDLL PBOSL_VellemanVM116_End()
;
UnmapViewOfFile_(ShareData)
CloseHandle_(hMapFile)
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Procedure GetShareData (address.l, ldata.l)
;
Define k.l
Define p.l = ShareData
!push edi
!mov edi,p
!add edi,address
!add edi,address
!add edi,address
!add edi,address
!mov eax,ds:[edi]
!mov k,eax
!pop edi
ProcedureReturn k
EndProcedure
Procedure.l SetShareData (address.l, ldata.l)
;
Define k.l
Define p.l = ShareData
!push edi
!mov edi,p
!add edi,address
!add edi,address
!add edi,address
!add edi,address
!mov ret,edi
!mov eax,Data
!mov ds:[edi],eax
!pop edi
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
ProcedureDLL.l StartDevice()
;
Define h.i
SetShareData(1, 222)
h = WinExec_("K8062E.exe", #SW_RESTORE)
EndProcedure
ProcedureDLL.l StopDevice()
;
SetShareData(0, 333)
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
ProcedureDLL.l SetChannelCount(count.l)
;
If count > 0
SetShareData(2,Count)
EndIf
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
ProcedureDLL.l SetSendData(channel.l, ldata.l)
;
If channel>0
SetShareData(Channel+10, ldata)
EndIf
EndProcedure
cordialement,
GallyHC
Re: Conversion d'un code en Delphi.
Publié : mer. 01/févr./2012 12:49
par djes
Je ne peux pas tester, mais ça ne doit pas être loin
Code : Tout sélectionner
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- INITIALISATION DES DIRECTIVES COMPILEUR.
EnableASM
EnableExplicit
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- DECLARATION DES VARIABLES (VERSION).
;{ - GLOBAL VERSION
#Version = "0.0.1"
#SubVers = "RC0"
#VerDate = "01/12/2011"
#DataSize = 2500
Global FullVer.s
Global FullName.s = "K8062DM Library for Vellaman VM116 in PureBasic"
Global FilePath.s
If #SubVers = #NULL$
FullVer = #Version
Else
FullVer = #Version + "-" + #SubVers
EndIf
;}
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- DECLARATION DES PROCEDURES DE LA DLL.
Declare.i StartDevice()
Declare.i StopDevice()
Declare.i SetData(channel.i, ldata.i)
Declare.i SetChannelCount(count.i)
Declare.i GetShareData(address.i)
Declare.i SetShareData(address.i, ldata.i)
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- DECLARATION DES VARIABLES (GLOBALE).
Global *ShareData
Global hMapFile.i
Global running.b = #False
Global VirtualFileName.s = "ShareK8062Data"
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;ProcedureCDLL PBOSL_VellemanVM116_Init()
ProcedureDLL AttachProcess(Instance)
hMapFile = CreateFileMapping_($FFFFFFFF, #Null, #PAGE_READWRITE, 0, #DataSize, VirtualFileName)
If hMapFile = 0
MessageRequester("Error", "Error creating memory mapped file", #PB_MessageRequester_Ok)
Else
*ShareData = MapViewOfFile_(hMapFile, #FILE_MAP_WRITE, 0, 0, #DataSize)
If *ShareData = 0
MessageRequester("Error", "Error creating memory mapped file", #PB_MessageRequester_Ok)
EndIf
EndIf
EndProcedure
;ProcedureCDLL PBOSL_VellemanVM116_End()
ProcedureDLL DetachProcess(Instance)
UnmapViewOfFile_(*ShareData)
CloseHandle_(hMapFile)
EndProcedure
ProcedureDLL AttachThread(Instance)
EndProcedure
ProcedureDLL DetachThread(Instance)
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Procedure.i GetShareData (address.i)
;
; Define k.l
; Define p.i = ShareData
; !push edi
; !mov edi,p
; !add edi,address
; !add edi,address
; !add edi,address
; !add edi,address
; !MOV eax,ds:[edi]
; !mov k,eax
; !pop edi
ProcedureReturn PeekI(*ShareData + address * SizeOf(address))
EndProcedure
Procedure.i SetShareData (address.i, ldata.i)
;
Define *k
*k = *ShareData + address * SizeOf(ldata)
PokeI(*k, ldata)
ProcedureReturn *k
; !push edi
; !mov edi,p
; !add edi,address
; !add edi,address
; !add edi,address
; !add edi,address
; !mov ret,edi
; !mov eax,Data
; !mov ds:[edi],eax
; !pop edi
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
ProcedureDLL.i StartDevice()
;
Define h.i
SetShareData(1, 222)
;RunProgram("K8062E.exe", "", "", #PB_Program_Hide)
h = WinExec_("K8062E.exe", #SW_RESTORE)
EndProcedure
ProcedureDLL.i StopDevice()
;
SetShareData(0, 333)
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
ProcedureDLL.i SetChannelCount(Count.i)
;
If Count > 0
SetShareData(2, Count)
EndIf
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
ProcedureDLL.l SetSendData(channel.i, ldata.i)
;
If channel > 0
SetShareData(Channel + 10, ldata)
EndIf
EndProcedure
Re: Conversion d'un code en Delphi.
Publié : mer. 01/févr./2012 19:11
par GallyHC
Bonjour et merci Djes,
Ce n'est pas encore exactement cela mais on avance
la fonction GetShareData(address.i), na pas de ldata.i comme dans la fonction SetShareData().
Merci,
GallyHC
Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 9:53
par djes
Ah oui, tiens ! J'ai corrigé. Est-ce que ça fonctionne ?
Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 11:17
par GallyHC
Bonjour,
je suppose que dans la partie "ProcedureReturn PeekI(*ShareData + address * SizeOf(ldata))", il faut que je supprime SizeOf(ldata).
Cordialement,
GallyHC
Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 11:49
par djes
Re-oups !

Re-corrigé

Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 11:51
par GallyHC
C'est clair que cela n'est pas facile si on ne peut pas vraiment teste le code

Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 12:15
par djes
Non ! Tu ne m'as pas dit si ça fonctionnait...

Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 12:23
par GallyHC
Oui j'avais pas dit car je faisait encore des tests mais j'ai des erreurs mémoire alors je recherche le prob

Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 13:40
par djes
Oulà il y avait un gros bug dans la création du file-mapping ! J'ai corrigé.
Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 15:59
par GallyHC
Bonjour Djes
Alors cela avance plutot bien, mais j'ai toujours une erreur quand j'utilise une ligne du style :
Code : Tout sélectionner
result = CallFunction(dmx512_openlibrary, "SetChannelCount", count)
la valeur de count me donne une erreur de lui meme. genre si count est a 4 pb me dit acces memoire invalide ... Erreur de lecture à l'adresse 4. Alors je me suis demander si a la place de "k = *ShareData + address * SizeOf(ldata)", il serait pas mieu de mettre "k = *ShareData + address * SizeOf(DataSize)", mais pas mieu...
Merci car cela avance bien

GallyHC
PS: la fonction End est interdite dans les DLL.
Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 16:36
par djes
J'ai modifié, est-ce qu'il y a un message d'erreur ? Tu peux "débogger" la DLL en mettant des messagerequester() ici et là pour savoir si les valeurs sont valides.
Au fait, pourquoi n'utilises-tu pas la dll qui est fournie dans le kit ?
Re: Conversion d'un code en Delphi.
Publié : jeu. 02/févr./2012 17:02
par GallyHC
La dll dans le quit fait plus de 40Ko pour pas grand chose et avec PB elel ne fait que 8Ko. De plus c'est aussi pour avoir une bonne metrise sur les evolutions futur.
Sinon l'erreur est bien a l'utilisation de la fonctione "SetChannelCount(count.i)".
le mapping a l'air de fonctionner et StartDevice() et StopDevice() fonctionne visiblement car si je ne met pas de SetChannelCount() le boitier ce met en fonction et de desactive sans prob.
mici
GallyHC