Я пытаюсь вызвать функции DLL C.
Но я получил StackOverflowException, поэтому я думаю, что что-то не так с функцией в качестве параметра.
Подробно это выглядит так.
C DLL (заголовочный файл):
typedef struct
{
MyType aType; /* message type */
int nItems; /* number of items */
const MyItems *lpItem; /* pointer to array of items */
} MyStruct;
typedef void (__stdcall *MyCbFunc) (HWND, const MyStruct *);
API(BOOL) RegisterCbFunc (ARGS, MyCbFunc);
В C # я пробовал это:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MyStruct
{
MyType aType;
int nItems;
MyItems[] lpItem;
}
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void CallbackDelegate(MyStruct mStruct);
[DllImport("MY.dll", CallingConvention=CallingConvention.StdCall)]
private static extern int RegisterCbFunc(IntPtr hWnd, Delegate pCB);
public static void MyCbFunc(MyStruct mStruct)
{
// do something
}
static void Main(string[] args)
{
CallbackDelegate dCbFunc = new CallbackDelegate(MyCbFunc);
int returnValue = RegisterCbFunc(IntPtr.Zero, dCbFunc);
// here, returnValue is 1
}
Это выполняется до тех пор, пока DLL не вызовет функцию обратного вызова. Тогда я получил ошибку:
An unhandled exception of type 'System.StackOverflowException' occurred in Microsoft.VisualStudio.HostingProcess.Utilities.dll
Спасибо за помощь.
ОТВЕТ:
Не знаю почему, но был ответ, который сейчас удален?!
Я пытаюсь восстановить его. Решением было использование вызова по ссылке вместо вызова по значению для параметра функции.
public delegate void CallbackDelegate(ref MyStruct mStruct);