# C DLL Question

## Recommended Posts

Hi! I have a question:

- Why the hell would an application crash when I launch it from windows explorer, and works all fine when I launch it from command prompt?????

More details:

- It's an app that uses a DLL written in pure C of mine

- The app also runs well when launched from SciTE (think it's a problem with the stdout...)

- The module concerned in the crash is msvcrt.dll

- All parts of the dll (event external libraries) are compiled using the same GCC (no any .NET sh*t)

- Not only with AutoIt, even if I try to use this DLL with FreeBasic, I have the same crash

- Befor, the DLL was not crashing this way, but I made many changes (and I didn't tracked them) since the last good version, so I have no idea where it comes from

Big thanks!

##### Share on other sites

I cannot see what's wrong without code, but once I had the same problem with an app not a DLL ritten in C. Problem was that the command line was different when starting the app from windows than starting the app from console. I parsed the app for first command line parameter (the path) and on console it was only 'app.exe' and in windows it was 'C:app.exe'. Something like that.

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

##### Share on other sites

Thanks!

But I don't think the problem is here, because I don't make any use of cmd line params in the dll nor in the app using the dll.

The code... first It's verry huge! (a total of 11370 lines with 6470 lines of code), and secondly, I don't yet know if I will release the code...

It's a DLL in pure C, using as external libs: GLFW, SOIL and inih

It's Object Oriented Syntax but with C. I mean all data structures are in opaque structs (only the dll know the members) and they are handled by the user with functions like: Sprite_Create (allocation), Sprite_Destroy (free), Sprite_SetPos, Sprite_GetPos ...

Gonna fill the functions with printf and test!

##### Share on other sites

Problem solved! Thanks to the printf function!

It was a not-completly initialized struct:

- I allocate a sort of global and internal struct that contains many internal informations. One of these informations is a flag (0/1) to say if a Render Window is opened. This flag was not initialized to 0 when creating th structure.

- When I call the OpenWindow function, this function checks the flag to see if it should open a window or not. And here was the problem (the flag wasn't initialized)

What I don't understand yet (although my problem was solved by initializing the flag to 0) is why this caused problem only when launching the application from Windows Explorer???

##### Share on other sites

Different program subsystems may or may not initialize values differently. You should never rely on uninitialized values because this sort thing can happen.

##### Share on other sites

Why create an oop c system, when there is an obvious alternative...

If you run the code in debug mode, your debugger should tell you, that youre accessing uninitialized variables.

Ever wanted to call functions in another process? ProcessCall UDFConsole stuff: Console UDFC Preprocessor for AutoIt OMG

##### Share on other sites

What alternative?

##### Share on other sites

C++. OOP on top of C.

##### Share on other sites

But by doing this, it will not be usable with AutoIt, which my first goal!

And I don't know why (perhaps because I don't master it) but I don't like C++

I'm also doing a FreeBasic wrapper to my engin, and It uses Classes

I'm near to release this engin, I just want to make a proper errors handling for it, and also (and this is the boringest thing ever!) a proper documentation (about 300 function!!!)

##### Share on other sites

AutoIt works fine with C++ dlls if you understand name mangling.

##### Share on other sites

How can AutoIt use C++ classes???

And if it is just for making simple, standard functions, I prefer staying with C

##### Share on other sites

How can AutoIt use C++ classes???

And if it is just for making simple, standard functions, I prefer staying with C

Every virtual class method/function is accessible by DllCallAddress() or ObjCreateInterface() for example. Number of other "ways" exist.

.

eMyvnE

## Create an account

Register a new account

• ### Similar Content

• By DevMode
welcome
I need help dealing with a C++ DLL
Specify that I need help with how to use this function
struct libusb_device; typedef struct libusb_context libusb_context; ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx,libusb_device ***list); My problem is how to deal with "libusb_device ***list"
my code
$libusb_device = DllStructCreate("PTR") Func libusb_init()$Var = DllCall($libusb0, "ptr", "libusb_init",'ptr',$_libusb_device_handle_Ptr) If @error Then Return False Return $Var[1] EndFunc Func libusb_get_device_list() MsgBox(0,VarGetType($_libusb_device_handle_Ptr),$_libusb_device_handle_Ptr)$Var = DllCall($libusb0, "int", "libusb_get_device_list","ptr",$_libusb_device_handle_Ptr,"ptr*",POINTER(POINTER($libusb_device)))$Error = @error If $Error Then Return False MsgBox(0,VarGetType($Var),$Error&@CRLF&$Var) _ArrayDisplay($Var) Return$Var[1] EndFunc
Thank you
iLibUSB.dll iLibUSB_32.dll libusb.h

• Hi all,
My programming knowledge is very basic.
I have an old script that creates shares and assign permissions. It normally registers SetAcl.ocx if necessary and creates an object to assign permissions.
The command that registers SetAcl was apparently working fine under Windows 7 but is not working under Windows 10.
RunWait("regsvr32.exe path\to\setacl.ocx /s", "", @SW_HIDE) As I'm logged in as admin, I changed this command to :
RunAsWait(@UserName, "", "", 0, "regsvr32.exe path\to\setacl.ocx /s", "", @SW_HIDE) It seems to terminate correctly but the script still doesn't work as expected.
To check that, I've created that small script :
Local $objSetAcl = ObjCreate("SETACL.SetACLCtrl.1") If IsObj($objSetAcl) Then ConsoleWrite("Object successfully created." & @CRLF) Else ConsoleWrite("Object not created. Registering SetAcl.ocx" & @CRLF) Local $result = RunAsWait(@UserName, "", "", 0, "regsvr32.exe path\to\setacl.ocx /s", "", @SW_HIDE); Use of my admin username to elevate CMD ConsoleWrite("Return code : " &$result & @CRLF) ConsoleWrite("Creating object" & @CRLF) $objSetAcl = ObjCreate("SETACL.SetACLCtrl.1") If IsObj($objSetAcl) Then ConsoleWrite("Object successfully created." & @CRLF) Else ConsoleWrite("Object creation failed." & @CRLF) EndIf EndIf It tries to register SetAcl.ocx, return code 0 seems to be fine but still can't use SetAcl.
But if I go to CMD as admin, run the regsvr32 command and restart my script, it can create the object without issue.
I know my poor knowledge makes me miss something. Anyone can help me figure this out ?
• By zoel
Hello people, I have a script which calls CMD and executes the netstat command, but when I run it through SCITE the GUI opens but I have no output, How can I run the command as administrator?
Here is my script so far
#include <AutoItConstants.au3> #include <GUIConstantsEx.au3> #include <GuiEdit.au3> #include <ScrollBarsConstants.au3> #include <WindowsConstants.au3> #RequireAdmin Local $aWndPos Local$hWnd = GUICreate("Form2", 900, 420, -1, -1, Default + $WS_MAXIMIZE) GUISetBkColor(0xE4E4E4) Local$idFilemenu = GUICtrlCreateMenu("&File") Local $idExititem = GUICtrlCreateMenuItem("Exit",$idFilemenu) Local $idInput = GUICtrlCreateEdit("", 210, 10, 660, 360) GUICtrlSetResizing(-1,$GUI_DOCKBORDERS) GUICtrlSetFont(-1, 10, 400, Default, "COURIER NEW") Local $idButton = GUICtrlCreateButton("NetStat", 10, 10, 190, 25) GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP,$GUI_DOCKWIDTH, $GUI_DOCKHEIGHT)) GUISetState(@SW_SHOW) While 1$nMsg = GUIGetMsg() Switch $nMsg Case$GUI_EVENT_CLOSE Exit Case $idExititem Exit Case$idButton GUICtrlSetData($idInput, _CmdInfo() & @CRLF) _GUICtrlEdit_Scroll($idInput, $SB_SCROLLCARET) _GUICtrlEdit_Scroll($idInput, $SB_SCROLLCARET) EndSwitch WEnd Func _CmdInfo($_sCmdInfo = "netstat /b") Local $iPID = Run(@ComSpec & " /c " &$_sCmdInfo, "", @SW_HIDE, BitOR($STDERR_CHILD,$STDOUT_CHILD)) ; Wait until the process has closed using the PID returned by Run. ProcessWaitClose($iPID) ; Read the Stdout stream of the PID returned by Run. This can also be done in a while loop. Look at the example for StderrRead. Local$sOutput = StringReplace(StdoutRead($iPID), @CRLF & @CRLF, @CRLF) Local$sOutErr = StringReplace(StderrRead($iPID), @CRLF & @CRLF, @CRLF) Local$sReult = $sOutput <> "" ?$sOutput : $sOutErr Return$sReult EndFunc
• By Synaps3
This script will make it so you can press Alt + "+" in Windows Explorer to select all files with the current file extension. This is something that I wanted for a long time and it should be a feature in Windows, but it's not. The only way to get close is to use the search thing (but then it shows the results excluding everything else) or to group by that type, but I don't want it grouped.
You can press Alt + Enter right after to open properties on those files or you can press delete to delete only files of that type.
You need the "Automating Windows Explorer" pack here: https://www.autoitscript.com/forum/topic/162905-automating-windows-explorer/

#include "Includes\AutomatingWindowsExplorer.au3" #include <Array.au3> Opt( "MustDeclareVars", 1 ) HotKeySet("!=", "SelectTypes") Func SelectTypes() ; Windows Explorer on XP, Vista, 7, 8 Local $hExplorer = WinGetHandle("[REGEXPCLASS:^(Cabinet|Explore)WClass$]") If Not $hExplorer Then MsgBox(0, "Explorer", "Could not find Windows Explorer.") Return EndIf$hExplorer = WinActive("[REGEXPCLASS:^(Cabinet|Explore)WClass$]") If Not$hExplorer Then MsgBox(0, "Explorer", "Windows Explorer is not in focus.") Return EndIf ; Get an IShellBrowser interface GetIShellBrowser($hExplorer) If Not IsObj($oIShellBrowser) Then MsgBox(0, "Explorer", "Could not get an IShellBrowser interface.") Return EndIf ; Get other interfaces GetShellInterfaces() ; Get selected files with full path ;GetFiles( $fSelected = False,$fFullPath = False, $fPidl = False,$iMax = 0 ) Local $aAllFiles = GetItems(False, False) Local$aFiles = GetItems(True, False) Local $sExt Local$i If UBound($aFiles) = 1 Then ;MsgBox(0, "Selected",$aFiles[0]) $sExt = StringRight($aFiles[0], StringLen($aFiles[0]) - StringInStr($aFiles[0], ".", 0, -1)) ;MsgBox(0, "Selected", $sExt) For$i = 0 To UBound($aAllFiles) - 1 If StringInStr($aAllFiles[$i], ".") > 0 Then If StringRight($aAllFiles[$i], StringLen($aAllFiles[$i]) - StringInStr($aAllFiles[$i], ".", 0, -1)) =$sExt Then SetSelectedItem($i) EndIf EndIf Next Else MsgBox($MB_ICONWARNING, "Error", "None or multiple items selected!") EndIf EndFunc While 1 GUIGetMsg() Wend

• Dear members of the forum,
I'm working on a project in which I have to use Image recognition technique.
Due to client restrictions, I couldn't use AutoIt for this project.
Is there a way to use this DLL "ImageSearchDLL.dll" (which is used to do image recognition steps in AutoIt) in VB.Net to achieve the same result?
I have used this DLL few years before and got good results. If there is a latest version of this DLL and if you can share it, that will be helpful too.
Any guidance is deeply appreciated.
×

• Wiki

• Back

• #### Beta

• Git
• FAQ
• Our Picks
×
• Create New...