LeftyGuitar Posted April 26, 2018 Share Posted April 26, 2018 Hello, I am trying to figure out why when displaying the amount of CPUs, it says 0 when it should say how many CPUs your CPU has. Note that I have wrapped this from the SDL2 library. Note that you do not have to automaticlly intiailize SDL2 when using some functions. Hence no SDL_Init in the example code. From SDL2.au3 Wrapper ;Open the SDL2 DLL Global $SDL = DllOpen("SDL2.dll") ;Check to make sure SDL2 DLL is there if $SDL = NULL Then MsgBox($MB_SYSTEMMODAL,"Error","Could not load SDL2.dll!\n") EndIf Func SDL_GetCPUCount() $xSDL_GetCPUCount = DllCall($SDL,"int:cdecl","SDL_GetCPUCount") Return $xSDL_GetCPUCount EndFunc #include "SDL2.au3" Local $Count = SDL_GetCPUCount() MsgBox(1,"CPU","CPUS:" & $Count) The MessageBox says 0, but I know it should tell me how many physical cores are in there. It worked when I wrapped SDL2 for my Euphoria programming language wrapper. I can post any other code if it is needed. Link to comment Share on other sites More sharing options...
RTFC Posted April 27, 2018 Share Posted April 27, 2018 From the DllCall documentation: Quote an array is returned that contains the function return value and a copy of all the parameters (including parameters that the function may have modified when passed by reference). $return[0] = function return value My Contributions and Wrappers Spoiler BitMaskSudokuSolver BuildPartitionTable CodeCrypter CodeScanner DigitalDisplay Eigen4AutoIt FAT Suite HighMem MetaCodeFileLibrary OSgrid Pool RdRand SecondDesktop SimulatedAnnealing Xbase I/O Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 27, 2018 Author Share Posted April 27, 2018 11 hours ago, RTFC said: From the DllCall documentation: I tried doing this Func SDL_GetCPUCount() $xSDL_GetCPUCount = DllCall($SDL,"int:cdecl","SDL_GetCPUCount") Return $xSDL_GetCPUCount[0] EndFunc and it still didn't work. I'm just confused on how to declare them to be used with a DLL. Link to comment Share on other sites More sharing options...
TheXman Posted April 27, 2018 Share Posted April 27, 2018 (edited) Like @RTFC said, the return from the DLLCall function is an array where [0] element is the return from the call. Look up DllCall in the help file for more details. This code works for me. Note that I renamed the DLL file because I put both of them in the same folder as the script. sdl_get_cpu_test() Func sdl_get_cpu_test() Local $aReturn = DllCall("sdl2_x64.dll", "int:cdecl", "SDL_GetCPUCount") If @error Then ConsoleWrite(StringFormat("@error = %i", @error) & @CRLF) Exit -1 EndIf ConsoleWrite(StringFormat("CPU count: %i", $aReturn[0]) & @CRLF) EndFunc Edited April 27, 2018 by TheXman CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 27, 2018 Author Share Posted April 27, 2018 ;SDL2.au3 file ;Open the SDL2 DLL Global $SDL = DllOpen("SDL2.dll") ;Check to make sure SDL2 DLL is there if $SDL = -1 Then MsgBox($MB_SYSTEMMODAL,"Error","Could not load SDL2.dll!\n") EndIf ;Struct for SDL_RECT Func SDL_Rect($x,$y,$w,$h) $xSDL_Rect = DllStructCreate("int;int;int;int") DllStructSetData($SDL_Rect,1,$x) DllStructSetData($SDL_Rect,2,$y) DllStructSetData($SDL_Rect,3,$w) DllStructSetData($SDL_Rect,4,$h) Return $xSDL_Rect EndFunc Func SDL_GetCPUCount() Global $xSDL_GetCPUCount = DllCall($SDL,"int:cdecl","SDL_GetCPUCount") Return $xSDL_GetCPUCount[0] EndFunc ;SDLTest1.au3 file #include "SDL2.au3" MsgBox(1,"CPUs:","CPU:" & SDL_GetCPUCount()) Note that I am trying to call the function from the SDL2.au3 file into the test file. It still is not showing up correctly. Link to comment Share on other sites More sharing options...
TheXman Posted April 27, 2018 Share Posted April 27, 2018 First, you should add @error checking after the DLLCall to make sure that it is successful. Second, you need to make sure you are referencing the correct DLL file (32 or 64 bit). If the DLL files are in the same folder, then you need to rename one like I did. If you are on a 64-bit OS and you are going to put the DLL files in the System32 folder, then you need to put the 64 bit file in the System32 folder and the 32 bit DLL file in the SysWOW64 folder. CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
TheXman Posted April 27, 2018 Share Posted April 27, 2018 14 minutes ago, LeftyGuitar said: Note that I am trying to call the function from the SDL2.au3 file into the test file. It still is not showing up correctly. With all due respect, I would get it working before trying to split the functions out into a UDF file. The example I gave you, if it references the correct DLL file, works. Get it working on your machine and then create your UDF file of SDL2 functions. When you do get to creating the UDF, unless there are going to be numerous calls to the SDL functions in succession, you don't need to do the DLLOpen(). CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 27, 2018 Author Share Posted April 27, 2018 Func SDL_GetCPUCount() Global $xSDL_GetCPUCount = DllCall($SDL,"int:cdecl","SDL_GetCPUCount") If @error Then ConsoleWrite("Error") Exit -1 EndIf ConsoleWrite(StringFormat("CPUs: %i", $xSDL_GetCPUCount[0]) & @CRLF) ;Return $xSDL_GetCPUCount[0] EndFunc SDL_GetCPUCount() ;This is from the SDL2.au3 file Ok I got it to work. I just can't get it to work in the UDF file. Note: That when I tried to run it from the SDL2.au3 file, The return command was not commented out. #include "SDL2.au3" Local $x = SDL_GetCPUCount() MsgBox(1,"CPUs:","CPU:" & $x[0]) Link to comment Share on other sites More sharing options...
TheXman Posted April 27, 2018 Share Posted April 27, 2018 (edited) The return value from the SDL_GetCPUCount function in your UDF is an integer not an array. Therefore, $x is just an integer not an array. MsgBox(1,"CPUs:","CPU:" & $x[0]) should be MsgBox(1,"CPUs:","CPU:" & $x) Edited April 27, 2018 by TheXman CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
TheXman Posted April 27, 2018 Share Posted April 27, 2018 Here's a very minimal example of one way to do it. It assumes that the 64-bit dll is named sdl2_x64.dll and the 32-bit dll is named sdl2.dll. SDL2.au3 #include-once Global $sDllFile = (@AutoItX64) ? ("sdl2_x64.dll") : ("sdl2.dll") Func sdl_get_cpu() Local $aReturn = DllCall($sDllFile, "int:cdecl", "SDL_GetCPUCount") If @error Then Return SetError(1, @error, -1) Return $aReturn[0] EndFunc Func sdl_get_system_ram() Local $aReturn = DllCall($sDllFile, "int:cdecl", "SDL_GetSystemRAM") If @error Then Return SetError(1, @error, -1) Return $aReturn[0] EndFunc Test script #include <SDL2.au3> Global $giCpuCount, $giSystemRam $giCpuCount = sdl_get_cpu() If @error Then MsgBox(0, "SDL CPU Count", StringFormat("Error encountered\r\n@error = %i\r\n@extended = %i", @error, @extended)) Exit EndIf $giSystemRam = sdl_get_system_ram() If @error Then MsgBox(0, "SDL System RAM", StringFormat("Error encountered\r\n@error = %i\r\n@extended = %i", @error, @extended)) Exit EndIf MsgBox( _ 0, "SDL Test", _ StringFormat("CPU Count = %i" , $giCpuCount) & @CRLF & _ StringFormat("System RAM = %i", $giSystemRam) _ ) CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 28, 2018 Author Share Posted April 28, 2018 (edited) Thanks for your help. It works in the SDL2.au3 file, however in the test script I get exit code 4294967295, I read this could be due to any number of factors, so I'm not sure why its not working in the test script, but works fine in the normal SDL2.au3 file. SDL2.au3 file (Note I'm using the normal 32-bit DLL) ;Open the SDL2 DLL Global $SDL = DllOpen("SDL2.dll") ;Check to make sure SDL2 DLL is there if $SDL = -1 Then MsgBox($MB_SYSTEMMODAL,"Error","Could not load SDL2.dll!\n") EndIf Func SDL_GetCPUCount() Local $xSDL_GetCPUCount = DllCall($SDL,"int:cdecl","SDL_GetCPUCount") If @error Then ConsoleWrite("Error") Exit -1 EndIf ;ConsoleWrite(StringFormat("CPUs: %i", $xSDL_GetCPUCount[0]) & @CRLF) Return $xSDL_GetCPUCount[0] EndFunc Func SDL_GetSystemRAM() Local $xSDL_GetSystemRAM = DllCall($SDL,"int:cdecl","SDL_GetSystemRAM") ;ConsoleWrite(StringFormat("RAM: %i", $xSDL_GetSystemRAM[0]) & @CRLF) Return $xSDL_GetSystemRAM[0] EndFunc Test Script #include <SDL2.au3> Global $giCpuCount, $giSystemRam $giCpuCount = SDL_GetCPUCount() If @error Then MsgBox(0, "SDL CPU Count", StringFormat("Error encountered\r\n@error = %i\r\n@extended = %i", @error, @extended)) Exit EndIf $giSystemRam = SDL_GetSystemRAM() If @error Then MsgBox(0, "SDL System RAM", StringFormat("Error encountered\r\n@error = %i\r\n@extended = %i", @error, @extended)) Exit EndIf MsgBox( _ 0, "SDL Test", _ StringFormat("CPU Count = %i" , $giCpuCount) & @CRLF & _ StringFormat("System RAM = %i", $giSystemRam) _ ) Edited April 28, 2018 by LeftyGuitar Link to comment Share on other sites More sharing options...
TheXman Posted April 28, 2018 Share Posted April 28, 2018 (edited) If you ran the test script that I supplied then the value of @extended would have pointed you to the reason that the dllcall failed. If it is "1", then it can't find the dll file. Are all of your files (test script, sdl2.au3, and dll files) in the same folder? My guess is no. The real question is in which folder did you put the dll files? 1 = unable to use the DLL file, 2 = unknown "return type", 3 = "function" not found in the DLL file, 4 = bad number of parameters, 5 = bad parameter. Edited April 28, 2018 by TheXman CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 28, 2018 Author Share Posted April 28, 2018 That's the issue. When I try to run the test script, it just gives me the error exit code: 4294967295 in the console window. So I don't know where the exact error is coming from. Link to comment Share on other sites More sharing options...
TheXman Posted April 28, 2018 Share Posted April 28, 2018 So you don't see a msgbox pop up? CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
TheXman Posted April 28, 2018 Share Posted April 28, 2018 cut and paste the output of the console window CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 28, 2018 Author Share Posted April 28, 2018 No I don't see a message box pop up. >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\Username\Documents\Code\SDLTest1.au3" Error>Exit code: 4294967295 Time: 0.6178 Link to comment Share on other sites More sharing options...
TheXman Posted April 28, 2018 Share Posted April 28, 2018 (edited) So you aren't using the test script and sdl2.au3 that I supplied? My code had additional error checking that would have identified the issue. Edited April 28, 2018 by TheXman CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 28, 2018 Author Share Posted April 28, 2018 Ok I added the error checking to the SDL2.au3 file and now it comes up with a message box saying Error encountered @error = 1 @extended = 1 So it isn't able to use the DLL? That's odd as its in the same directory as both the SDL2.au3 and the test script file. Link to comment Share on other sites More sharing options...
TheXman Posted April 28, 2018 Share Posted April 28, 2018 No we are getting somewhere. It can't find the dll file. Did you put both dll files in the same folder? Did you rename the 64 bit dll file to sdl2_x64.dll? From the console output, I see you are executing the script using the 32-bit autoit.exe. so it will be looking for sdl2.dll, if you used the sdl2.au3 that I supplied. CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
LeftyGuitar Posted April 28, 2018 Author Share Posted April 28, 2018 (edited) Ok I got it. This code works. ;Open the SDL2 DLL Global $SDL = ("SDL2.dll") This code prevented it from using the DLL. Anyways, it seems to be working now. ;Open the SDL2 DLL Global $SDL = OpenDLL("SDL2.dll") Thanks for all your help. Edited April 28, 2018 by LeftyGuitar Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now