Ich hab's geschafft, eine 32Bit-Dll zu erstellen und mit AutoIt nutzen zu können. Und zwar habe ich die 32Bit-Version und die 64Bit-Version von mingw gemäß dieser Anleitung installiert: https://github.com/khchen/winim (ganz unten bei: Cross Compile)
Hinweis: <USER> mit eurem Usernamen ersetzen!
Bei mir liegen jetzt also im Verzeichnis c:\Users\<USER>\.choosenim\toolchains\nim-1.2.0\dist\ zusätzlich zum "nimble"-Ordner, die beiden Ordner "mingw64" und "mingw32".
Dann im Verzeichnis c:\Users\<USER>\.choosenim\toolchains\nim-1.2.0\config\ die Datei "nim.cfg" ändern. Ab Zeile 162 muss da jetzt folgendes stehen:
# Configuration for the GNU C/C++ compiler:
@if windows:
@if i386:
gcc.path = r"$nim\dist\mingw32\bin"
@else:
gcc.path = r"$nim\dist\mingw64\bin"
@end
@if gcc or tcc:
tlsEmulation:on
@end
@end
Alles anzeigen
Und dann den Compiler mit dieser Zeile starten: nim c -d:release --cpu:i386 -o:math32.dll program.nim
Ja, ganz wichtig, ohne "--app:lib"!
"program.nim" ist die von BugFix erstellte Nim-Dll:
proc addiere(p1, p2: int): int {.stdcall, exportc, dynlib.} =
p1 + p2
proc subtrahiere(p1, p2: int): int {.stdcall, exportc, dynlib.} =
p1 - p2
proc multipliziere(p1, p2: int): int {.stdcall, exportc, dynlib.} =
p1 * p2
proc dividiere(p1, p2: float): float {.stdcall, exportc, dynlib.} =
p1 / p2
Alles anzeigen
So wurde die Dll zumindest schonmal in AutoIt erfolgreich geladen.
Im Hex-Editor habe ich dann die "falschen" Funktionsnamen gesehen (wie BugFix schon schrieb). Also habe ich in AutoIt die Funktionen auch mit diesen "falschen" Namen aufgerufen und das funktionierte dann.
#AutoIt3Wrapper_UseX64=n
Local $hDll = DllOpen(@ScriptDir & "\math32.dll")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hDll = ' & $hDll & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Local $aRes, $a = 9, $b = 18
$aRes = DllCall($hDll, 'int', 'addiere@8', 'int', $a, 'int', $b)
If Not @error Then ConsoleWrite('addiere ' & $aRes[0] & @CRLF)
$aRes = DllCall($hDll, 'int', 'subtrahiere@8', 'int', $a, 'int', $b)
If Not @error Then ConsoleWrite('subtrahiere ' & $aRes[0] & @CRLF)
$aRes = DllCall($hDll, 'int', 'multipliziere@8', 'int', $a, 'int', $b)
If Not @error Then ConsoleWrite('multipliziere ' & $aRes[0] & @CRLF)
$aRes = DllCall($hDll, 'double', 'dividiere@16', 'double', $a, 'double', $b)
If Not @error Then ConsoleWrite('dividiere ' & $aRes[0] & @CRLF)
DllClose($hDll)
Alles anzeigen