Conversion d'un code en Delphi.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Conversion d'un code en Delphi.

Message 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
Dernière modification par GallyHC le dim. 29/janv./2012 22:27, modifié 2 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un code en Delphi.

Message 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
Dernière modification par djes le ven. 03/févr./2012 19:03, modifié 6 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un code en Delphi.

Message par djes »

Ah oui, tiens ! J'ai corrigé. Est-ce que ça fonctionne ?
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message par GallyHC »

Bonjour,

je suppose que dans la partie "ProcedureReturn PeekI(*ShareData + address * SizeOf(ldata))", il faut que je supprime SizeOf(ldata).

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un code en Delphi.

Message par djes »

Re-oups ! :lol: Re-corrigé ;)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message par GallyHC »

C'est clair que cela n'est pas facile si on ne peut pas vraiment teste le code :)
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un code en Delphi.

Message par djes »

Non ! Tu ne m'as pas dit si ça fonctionnait... :)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message 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 :)
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un code en Delphi.

Message par djes »

Oulà il y avait un gros bug dans la création du file-mapping ! J'ai corrigé.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message 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.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un code en Delphi.

Message 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 ?
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un code en Delphi.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Répondre