Important notes for using "WSQ image library" in "MS Visual Studio 2010".
1. "WSQ image library" is a native 32-bit Windows DLL.
In IDE of MS "Visual Studio 2010" you need to set "targeted platform" as "x86".
2. You need to "run as administrator" the IDE compiler and application.
3. .NET 2.0+ assumes that DLL calling convention is Cdecl, while .NET 4.0 does not.
You need to explicitly set calling convention to Cdecl when using "WSQ image library" in .NET 4.0.
As for example:
Visual C# .NET
NET 2.0+ version:
[DllImport("WSQ_library.dll")] |
NET 4.0 version:
[DllImport("WSQ_library.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] |
Visual Basic .NET
NET 4.0 version:
<DllImport("WSQ_library.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Auto)> _ |
4. When trying to run application in "MS Visual
Studio 2010" you might receive the error message
"Attempting
managed execution inside OS Loader lock. Do not attempt to run managed
code inside a DllMain or image initialization function since doing so
can cause the application to hang".
The solution:
In IDE go to the menu "Debug", then go to the menu "Exceptions", and then expand "Managed Debugging Assistants", and uncheck "Thrown" for "LoaderLock".
5. If application is built targeting version 4.0 of the .NET Framework, the call to the unmanaged DLL will always fail with a StackOverflowException under the debugger.
If application is built targeting version 3.5 (or lower) of the .NET Framework, it works correctly.
The solution:
As a workaround solution is to run the application in IDE without debugger (Ctrl-F5), then application will work correctly. Also you can build application and run it outside of IDE.
This is a known bug of "MS VS2010 compiler". Please
check out for updates and hotfixes from Microsoft for the latest
solution to this problem.
The problem is caused by IIS 6.0.
IIS 6.0 does not support full set of Win32 API functions, including very fundamental ones like for example MessageBox or creating and showing Forms.
The only solution to this problem is to remove from DLL all native Win32 API calls which IIS 6.0 fails to support and recompile DLL with all MessageBoxes and Forms removed. Cognaxon has built such ripped version of DLL which IIS 6.0 is able to load.
To download special version of "WSQ image library" with Registration utility click here
To download Microsoft Visual C# .NET 2003 sample project click here
To download Microsoft Visual Basic .NET 2003 sample project click here
Please extract the zip file, inside you will find file “WSQ_library.dll” which is a version of DLL build specially to work under ASP.NET + II6.0 environment.
This version of “WSQ image library” DLL is almost
identical to standard version of DLL, only with small difference:
it does not have pop-up window of "file properties"
and it does not have "file format converter" utility
but most probably you do not need them anyway (in other words in this
version of DLL all Forms and MessageBoxes are removed).
Also please note that ASP.NET requires that DLL files
must be located in "system32" directory/folder. As for example, under
Windows XP you need to copy the file "WSQ_library.dll" to
"C:\WINDOWS\system32" directory/folder.
This problem affects all Win32 DLLs which are called from .NET program. And WSQ image library is exactly Win32 DLL, so it is affected too.
It is known bug of .NET platform.
This issue is caused by thirty-part applications or controls (in our case by "WSQ image library" DLL), which change floating-point control register so floating-point exceptions like overflow are unmasked.
.NET Framework assumes that the FPU control register is set to mask floating point exceptions.
The solution is to declare function in your code
Visual Basic .NET
<DllImport("msvcr70.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Auto)> _ |
Visual C# .NET
[DllImport("msvcr70.dll", CallingConvention = CallingConvention.Cdecl)] |
And after calling any function from Win32 DLL you
need to reset the FPC Register (Word) to its default value as expected
by .NET framework.
Program code for reseting FPC Register is
Visual Basic .NET
_controlfp(&H9001F, &HFFFFF) |
Visual C# .NET
_controlfp(0x9001f, 0xfffff); |
As a demonstration of this problem consider Visual Basic .NET code
OutputPicture.Image = Bitmap.FromHbitmap(_CreateBMPFromFile(lpszDialogFileName)) |
If you remove line
_controlfp(&H9001F, &HFFFFF) |
from the code, the application will crash trying to create font on line
Font1 = New System.Drawing.Font("Courier New", 8.25F, _ |