|I need help with a strange problem.
Symptom: my C# application crashes with a AccessViolationException. The interesting thing is that it happens only when running as 32bit-process on 64-bit Windows. Running 32bit on 32bit works fine, so does 64bit on 64bit.
FxCop does not complain about my P/Invoke declarations, so I don't think I confused IntPtr and int parameters - it runs fine both as 32bit process and 64bit process - just not as 32 bit process on Windows XP Professional x64 Edition.
Using the managed debug assistent in VS05, I get the error message "The runtime has encountered a fatal error. The address of the error was at 0x79fccc04, on thread 0x6c8. The error code is 0xc0000005.".
The line where it's failing is "return CallNextHookEx(...);", the callstack suggests it fails while/after calling CallNextHookEx; not when returning from my own hook procedure. What makes this really interesting is that the code using the hook is working fine until the text-editor portion of the app is activated. It crashes when the hook receives the message caused by activating the IME (input method editor; for asian languages).
Here is the P/Invoke declaration for the hook (I'm creating the hook with code=WH_CALLWNDPROCRET, hInstance=IntPtr.Zero and threadID=AppDomain.GetCurrentThreadId()):
internal delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);
internal static extern IntPtr SetWindowsHookEx(HookType code, HookProc func, IntPtr hInstance, int threadID);
internal static extern int UnhookWindowsHookEx(IntPtr hhook);
internal static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wParam, IntPtr lParam);
CallNextHookEx[^] definition from MSDN:
LRESULT CallNextHookEx(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam);
And here is the P/Invoke declaration for the IME:
private const int WM_IME_CONTROL = 0x0283;
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, [In, MarshalAs(UnmanagedType.LPStruct)] LOGFONT lParam);
[ StructLayout(LayoutKind.Sequential) ]
private class LOGFONT
public int lfHeight = 0;
public int lfWidth = 0;
public int lfEscapement = 0;
public int lfOrientation = 0;
public int lfWeight = 0;
public byte lfItalic = 0;
public byte lfUnderline = 0;
public byte lfStrikeOut = 0;
public byte lfCharSet = 0;
public byte lfOutPrecision = 0;
public byte lfClipPrecision = 0;
public byte lfQuality = 0;
public byte lfPitchAndFamily = 0;
[ MarshalAs(UnmanagedType.ByValTStr, SizeConst=32) ] public string lfFaceName = null;
So, how could I find what the problem is? Are there any other tools for checking such problems? I don't have any idea what can I do now. We need to run as 32bit on 64bit Windows because a library used by another part of the app is available for 32bit only.