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