Jump to content
Sign in to follow this  

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 this post

Link to post
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.

  • Like 1

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 this post

Link to post
Share on other sites


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 this post

Link to post
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???

Thanks for who readed me!

Share this post

Link to post
Share on other sites
Richard Robertson

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

  • Like 1

Share this post

Link to post
Share on other sites
Richard Robertson

C++. OOP on top of C.

Share this post

Link to post
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 this post

Link to post
Share on other sites
Richard Robertson

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

Share this post

Link to post
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 this post

Link to post
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.




Share this post

Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • nacerbaaziz
      By nacerbaaziz
      Hi dear
      With this script you can print Unicode text in the CMD screen
      the script is  easy to use
      just you  write the text that contains Unicode in the first input
      and the script automatically reflect the code in the second input
       you can copy the text to the clipboard
      or you can try printing the text in the CMD window
      I apologize to everyone for colors and shape if not appropriate
      I'm a blind man and I do not see
      Thank you for your understanding
      Greetings to all of youCmdUtM.au3
    • francoiste
      By francoiste
      this is a follow-up to
      i sporadically and very rarely get an access violation exception.
      here is some simplyfied repro code:
      #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #AutoIt3Wrapper_Run_Tidy=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include-once #include <Array.au3> #include <security.au3> ;~ #include "ESC_Globals.au3" Global Const $WTS_CURRENT_SESSION = -1 Global Const $WTS_CURRENT_SERVER_HANDLE = 0 Global Const $WTS_CLIENTPROTOCOLTYPE = 16 Global Const $WTS_CONNECTSTATE = 8 Global Const $WTS_USERNAME = 5 Global Const $tagWTS_SESSION_INFO = _ "dword SessionId;" & _ "ptr WinStationName;" & _ "uint State" Global Const $tagWTS_PROCESS_INFO = _ "DWORD SessionId;" & _ "DWORD ProcessId;" & _ "PTR pProcessName;" & _ "PTR pUserSid" For $i = 0 To 1000 * 20 ConsoleWrite("iteration " & $i & @CRLF) _GetProcessList() Sleep(1000) Next MsgBox(0, "COMPLETED", "everything done") ;***************************************** ;# returns an array: ProcessName | ProcessID | SessionID | ProcessOwner Func _GetProcessList() Local $i, $aRet ConsoleWrite("_GetProcessList() --> " & @AutoItPID & @CRLF) Local $aProcessList = ProcessList() $aRet = DllCall("WTSApi32.dll", "int", "WTSEnumerateProcesses", "int", $WTS_CURRENT_SERVER_HANDLE, "int", 0, "int", 1, "ptr*", 0, "int*", 0) If @error Or ($aRet[0] == 0) Then MsgBox(4096 + 48, "Error", "Failed invoking WTSEnumerateProcesses") Return (SetError(1, 0, -1)) EndIf Local $array[$aRet[5]][4] Local $mem = DllStructCreate($tagWTS_PROCESS_INFO, $aRet[4]) For $i = 0 To $aRet[5] - 1 ConsoleWrite("IT: " & $i) ;# DEBUG $mem = DllStructCreate($tagWTS_PROCESS_INFO, $aRet[4] + ($i * DllStructGetSize($mem))) ConsoleWrite(" - PID: ") ;# DEBUG $array[$i][1] = Int(DllStructGetData($mem, "ProcessId"), 1) ;# convert to Int32 ConsoleWrite($array[$i][1]) ;# DEBUG ConsoleWrite("; SID: ") ;# DEBUG $array[$i][2] = Int(DllStructGetData($mem, "SessionId"), 1) ;# convert to Int32 ConsoleWrite($array[$i][2]) ;# DEBUG Local $name1 = "???" For $j = 1 To $aProcessList[0][0] If $aProcessList[$j][1] == $array[$i][1] Then $name1 = $aProcessList[$j][0] ExitLoop EndIf Next ConsoleWrite("; NAME1: " & $name1) ;# DEBUG ConsoleWrite("; NAM") ;# DEBUG Local $ret2 = DllStructGetData($mem, "pProcessName") ConsoleWrite("E") ;# DEBUG Local $ret3 = DllStructCreate("char[256]", $ret2) Local $myRet = @error ConsoleWrite(": ") ;# DEBUG If $myRet == 0 Then Local $string = "" & DllStructGetData($ret3, 1) & "" ;# <==== here it sometimes CRASHES $array[$i][0] = $string ConsoleWrite($array[$i][0]) ;# DEBUG Else MsgBox(4096 + 48, "Error", "Failed for DllStructCreate: " & $myRet) ;# i never got here $array[$i][0] = "???" ConsoleWrite($array[$i][0]) ;# DEBUG EndIf ConsoleWrite("; OWNER") ;# DEBUG Local $ret3 = _Security__LookupAccountSid(DllStructGetData($mem, "pUserSid")) ConsoleWrite(": ") ;# DEBUG If IsArray($ret3) Then $array[$i][3] = "" & $ret3[1] & "/" & $ret3[0] & "" ConsoleWrite($array[$i][3]) ;# DEBUG EndIf ConsoleWrite(@CRLF) ;# DEBUG Next ConsoleWrite("endLoop." & @CRLF) ;# DEBUG DllCall("WTSApi32.dll", "int", "WTSFreeMemory", "int", $aRet[4]) ConsoleWrite("_GetProcessList() <-- " & @AutoItPID & @CRLF) ;# DEBUG Return $array EndFunc ;==>_GetProcessList
      first of all i'd like to understand WHY it crashes in DllStructGetData.
      and then i'd like to AVOID it, of course
      so far i have found no way to add some try-catch logic in AutoIt.
      any ideas why it would crash under very rare circumstances?
      my script is 32bit executed on windows 64bit OS.
      i have seen it on both, windows 7 and windows 10.
      i have seen it with both, script execution and compiled exe.
    • Simpel
      By Simpel
      Thanks to this post (https://www.autoitscript.com/forum/topic/189553-writing-to-cmd/?do=findComment&comment=1361142) I can now write a helpfile to the cmd when for instance passing parameter -h or -help at cmd. But then cmd is blocked by the script (I had to free it with CTRL+BREAK):
      #include <WinAPI.au3> _WinAPI_AttachConsole() $hConsole = _WinAPI_GetStdHandle(1) _WinAPI_WriteConsole($hConsole, "Print helpfile................" & @CRLF) Inside MSDN Library then I found this sentence: A process can use the FreeConsole function to detach itself from its console.
      But I don't find something like _WinAPI_FreeConsole(). How can I do it in another way?
      Regards, Conrad
    • TheAutomator
      By TheAutomator
      A fullscreen console with custom commands!

      Hi everyone!
      This funny project started as a question in the help section:
      I'd like to share this script with everyone that is interested. 
      Why would I want it?
      You like the old style fullscreen console (like in the old day's), You can add custom commands, You can customize the font a lot more compared to cmd.exe, You can share ideas or add tweaks to the script.  
      Still to do:
      Write a simple custom programming language to implement this tool. Writing a little help file / pdf to describe my little programming language. Add little sound effects like a beep if there is a syntax error (optional). Clean up and modify Console.Au3 content. Add an option to have to type a login password (optional). Make an optional installer that also gives scripts for this tool a custom icon and open with command. ...Call Neo?  
      Thanks to:
      xxaviarxx: debugging, some ideas. jguinch: debugging, adding a bunch of tweaks and ideas. kylomas: debugging, new ideas.  
      Edits and updates:
      Added usage of tab key in edit control Edit has focus now on startup I'm currently rewriting a simple custom programming language to implement this tool.  
      UDF download: Console.au3
    • Pintu
      By Pintu
      Good evening guys,
      i'm having a problem, not about the code (i'm only thinking about it at the moment) but about the way i can do it.
      I have a webpage (photo N.1) it has some elements in it.
      I need only the table (photo N.2), looking at the code and with _IEFunctions i can easy find the table but how i can i "copy" it?
      As i said it's really easy to found with a script but what should i do then? Copy the source? And how can i display it to the user?
      In my head i'd like to display it inside a GUI, is that possible?
      Thanks in advance
      Edit: Posted 2 times same photo. Now should be OK