digitalmars.D.learn - Problems when using DLL-Functions
- =?ISO-8859-15?Q?Marc_M=FCller?= (72/72) Jul 09 2007 Hello,
- torhu (5/14) Jul 09 2007 The stack getting scrambled is a tell-tale sign of using the wrong
- =?ISO-8859-15?Q?Marc_M=FCller?= (11/16) Jul 09 2007 Thanks for the hint. When I try extern(Windows) the Compiler/Linker
- BLS (6/101) Jul 09 2007 Ahem,
Hello, I wrote a small program, which is using a function from a Windows system-dll. So I used the implib-tool to get a corresponding library-file: implib.exe /s wintab32.lib C:\WINDOWS\system32\Wintab32.dll I can call functions from the dll correctly and also get the expectet return values. But under some circumstances the application crashes - and I just don't know why... ========================================================= import std.stdio; import std.c.windows.windows; extern(C) UINT WTInfoA(UINT, UINT, LPVOID); version = A; void main(char[][] args) { version (A) { writefln("Getting WTInfo..."); WTInfoA(0, 0, null); writefln("Received WTInfo"); } version (B) { writefln("Getting WTInfo..."); int value = WTInfoA(0, 0, null); writefln("Received WTInfo"); } version (C) { try { writefln("Getting WTInfo..."); WTInfoA(0, 0, null); writefln("Received WTInfo"); } catch (Exception e) { writefln("An error has occured:"); writefln(e.msg); } } version (D) { if (WTInfoA(0, 0, null)==0) writefln("No graphic tablet available"); } } ========================================================= Now the funny part: As you can see all versions A-D are doing more or less the same. Version A crashes with the following output: Version B works fine. Version C (which is identical to version A - just surrounded by a try-catch-block) does neither crash nor it throws an exception. Version D, which also evaluates the return-Value from the function call like version B crashes. I think anything is scrambling my stack - but it is absolutely unpredictable when this occurs - and I have no clue what I can do :-( The errors are reproducable - Version A always crashes while version B never crashes. Do you have an Idea? Kind regards, -Marc-
Jul 09 2007
Marc Müller wrote:extern(C) UINT WTInfoA(UINT, UINT, LPVOID);Try extern (Windows) instead of extern (C) here.I think anything is scrambling my stack - but it is absolutely unpredictable when this occurs - and I have no clue what I can do :-( The errors are reproducable - Version A always crashes while version B never crashes. Do you have an Idea?The stack getting scrambled is a tell-tale sign of using the wrong calling convention. I can't find WTInfoA on msdn.com, but I'm guessing it's a stdcall function.
Jul 09 2007
torhu schrieb:Marc Müller wrote:Thanks for the hint. When I try extern(Windows) the Compiler/Linker complains: Error 42: Symbol Undefined _WTInfoA 12 Listing the content of the lib-file with libunres.exe -e -p wintab32.lib results in: ... _WTInfoA ... -Marc-extern(C) UINT WTInfoA(UINT, UINT, LPVOID);Try extern (Windows) instead of extern (C) here.
Jul 09 2007
Marc Müller schrieb:Hello, I wrote a small program, which is using a function from a Windows system-dll. So I used the implib-tool to get a corresponding library-file: implib.exe /s wintab32.lib C:\WINDOWS\system32\Wintab32.dll I can call functions from the dll correctly and also get the expectet return values. But under some circumstances the application crashes - and I just don't know why... ========================================================= import std.stdio; import std.c.windows.windows; extern(C) UINT WTInfoA(UINT, UINT, LPVOID); version = A; void main(char[][] args) { version (A) { writefln("Getting WTInfo..."); WTInfoA(0, 0, null); writefln("Received WTInfo"); } version (B) { writefln("Getting WTInfo..."); int value = WTInfoA(0, 0, null); writefln("Received WTInfo"); } version (C) { try { writefln("Getting WTInfo..."); WTInfoA(0, 0, null); writefln("Received WTInfo"); } catch (Exception e) { writefln("An error has occured:"); writefln(e.msg); } } version (D) { if (WTInfoA(0, 0, null)==0) writefln("No graphic tablet available"); } } ========================================================= Now the funny part: As you can see all versions A-D are doing more or less the same. Version A crashes with the following output: Version B works fine. Version C (which is identical to version A - just surrounded by a try-catch-block) does neither crash nor it throws an exception. Version D, which also evaluates the return-Value from the function call like version B crashes. I think anything is scrambling my stack - but it is absolutely unpredictable when this occurs - and I have no clue what I can do :-( The errors are reproducable - Version A always crashes while version B never crashes. Do you have an Idea? Kind regards, -Marc-Ahem, If not allready done; Have a look t the D Forum , it seems that our D - Debugger developer -Jascha Wetzel- found a solution. Bjoern That s about suggestion something :-(
Jul 09 2007