ProcedureDLL: Map zurückgeben, bzw. Alternative zu Maps
Verfasst: 18.03.2011 19:45
Hallo!
Mein Programm ruft eine Prozedur aus einer DLL auf, welche ein paar CPU-Flags (SSE1 - SSE3, SSSE3, MMX und Co.) abfragt und in einer Map abspeichert. Für einen Fall wie diesen sind Maps ja wie gemacht. Das Problem daran: Wie kann ich die Map returnen, sodass ich sie im aufrufenden Programm verwenden kann? Und wenn's funktionieren würde, könnte man diese DLL nur in PureBasic nutzen, da der Purebasic-Typ 'Map' wohl in anderen Programmiersprachen genutzt werden kann.
Jetzt frage ich mich: Gibt es noch eine andere Datenstruktur/Möglichkeit, welche ich hier nutzen könnte, um die Flags zurückzugeben? Das ganze sollte möglichst ohne viel ADTs passieren (also jetzt eine eigene HashMap programmieren, welche man dann auch noch in jedem Ruferprogramm definieren muss). Zuvor hab ich's mit Strings gemacht, allerdings gleich wieder weggemacht, weil Effizienz = 0.
Hier noch ein (nicht funktionierender) Code:
Mein Programm ruft eine Prozedur aus einer DLL auf, welche ein paar CPU-Flags (SSE1 - SSE3, SSSE3, MMX und Co.) abfragt und in einer Map abspeichert. Für einen Fall wie diesen sind Maps ja wie gemacht. Das Problem daran: Wie kann ich die Map returnen, sodass ich sie im aufrufenden Programm verwenden kann? Und wenn's funktionieren würde, könnte man diese DLL nur in PureBasic nutzen, da der Purebasic-Typ 'Map' wohl in anderen Programmiersprachen genutzt werden kann.
Jetzt frage ich mich: Gibt es noch eine andere Datenstruktur/Möglichkeit, welche ich hier nutzen könnte, um die Flags zurückzugeben? Das ganze sollte möglichst ohne viel ADTs passieren (also jetzt eine eigene HashMap programmieren, welche man dann auch noch in jedem Ruferprogramm definieren muss). Zuvor hab ich's mit Strings gemacht, allerdings gleich wieder weggemacht, weil Effizienz = 0.
Hier noch ein (nicht funktionierender) Code:
Code: Alles auswählen
;DLL-Code
ProcedureDLL GetCpuFlags()
; Code großteils aus dem CodeArchiv
Global mmx.b = 0 ;MMX
Global dnow.b = 0 ;3DNow!
Global ednow.b = 0 ;ext3DNow!
Global cmov.b = 0 ;CMovCC
Global sse.b = 0 ; SSE
Global sse2.b = 0 ;SSE2
Global sse3.b = 0 ;SSE3
Global ssse3.b = 0 ;SSSE3
Global SSE41.b = 0 ;SSE4.1
Global SSE42.b = 0 ;SSE4.2
Global Bit0.l = $1
Global Bit9.l = $200
Global Bit15.l = $8000
Global Bit21.l = $200000
Global Bit23.l = $800000
Global Bit25.l = $2000000
Global Bit26.l = $4000000
Global Bit30.l = $40000000
Global Bit31.l = $80000000
Global SSE41b.l = $80000
Global SSE42b.l = $100000
!mov eax,1h
!cpuid
!test edx,[v_Bit23]
!jz l_nommx
!mov [v_mmx],1
NOMMX:
!test edx,[v_Bit25]
!jz l_nosse
!mov [v_sse],1
NOSSE:
!test edx,[v_Bit26]
!jz l_nosse2
!mov [v_sse2],1
NOSSE2:
!test ecx,[v_Bit0]
!jz l_nosse3
!mov [v_sse3],1
NOSSE3:
!test ecx,[v_Bit9]
!jz l_nossse3
!mov [v_ssse3],1
NOSSSE3:
!test edx,[v_Bit15]
!jz l_nocmov
!mov [v_cmov],1
NOCMOV:
!mov eax,80000000h
!cpuid
!cmp eax,80000000h
!jbe l_noext
!mov eax,80000001h
!cpuid
!or eax,eax
!je l_noext
!test edx,[v_Bit31]
!jz l_noext
!mov [v_dnow],1
!test edx,[v_Bit30]
!jz l_noext
!mov [v_ednow],1
NOEXT:
!test ecx,[v_SSE41b]
!jz l_nosse41
!mov [v_SSE41], 1
NOSSE41:
!test ecx,[v_SSE42b]
!jz l_nosse42
!mov [v_SSE42], 1
NOSSE42:
NewMap m.b();
m("MMX") = MMX
m("3DNow") = dnow
m("ext3DNow") = ednow
m("CMov") = cmov
m("SSE") = SSE
m("SSE2") = SSE2
m("SSE3") = SSE3
m("SSE41") = SSE41
m("SSE42") = SSE42
m("SSSE3") = ssse3
ProcedureReturn @m()
EndProcedure
Code: Alles auswählen
;Programmcode
If OpenLibrary (0,"cpu.dll")
Prototype.i _GetCpuFlags()
Global GetCpuFlags._GetCpuFlags = GetFunction(0,"GetCpuFlags")
Endif
Structure CPU
Architecture.l
Cores.b
Map *Flags.b()
EndStructure
Define.CPU Processor
Processor\Flags() = GetCpuFlags()