【发布时间】:2023-04-05 04:37:01
【问题描述】:
如果我解决了几天的问题,我将不胜感激。
我有一个这样声明的原生 C++ 函数类型:
typedef STATUS (T_TED_AcppBoxDYN_RegisterEventCallback) (
PEventCallback function, // pointer to the customer callback
PVOID param // custom data (returned in callback)
);
PEventCallback 和 PEVENT 声明如下:
typedef int (*PEventCallback) (PEVENT event, PVOID param);
typedef struct
{
int nEventId;
void* pParam;
} EVENT,*PEVENT;
C++ 代码提供了一个指向该类型函数的指针作为全局变量:
T_TED_AcppBoxDYN_RegisterEventCallback* TED_AcppBoxDYN_RegisterEventCallback
= NULL;
稍后通过以下代码初始化:
#ifdef LOAD_PROC_ADDRESS
#undef LOAD_PROC_ADDRESS
#endif
#define LOAD_PROC_ADDRESS(handle,func) \
if((func=(T_##func*)GetProcAddress(handle,#func))==NULL) \
{\
sMsg.Format( "Error occurs while loading entry point\n'%s'\n"\
"from detector DLL '%s'\n", GetName (), #func );\
MessageBox(NULL, sMsg.GetBuffer(), "Load Proc Error", MB_OK | MB_ICONSTOP);\
return (false);\
}
bool P5100EDllManager::LoadProc ()
{
CString sMsg;
HMODULE hDllHandle = GetHandle();
if (hDllHandle == NULL)
{
return false; // cannot load the proc if the dll has not been loaded
}
LOAD_PROC_ADDRESS(hDllHandle, TED_AcppBoxDYN_RegisterEventCallback);
return true;
}
我想从 C# 中调用指向函数。为此,我定义了一个 C# 包装器:
public delegate void TDICallBack(IntPtr callbackEvent, IntPtr pParam);
[DllImport(DLL, EntryPoint = "TED_AcppBoxDYN_RegisterEventCallback", CallingConvention = CallingConvention.Cdecl)]
private static extern int TED_AcppBoxDYN_RegisterEventCallback(TDICallBack callBack, IntPtr param);
public void RegisterEventCallback(TDICallBack callBack, IntPtr param)
{
TED_AcppBoxDYN_RegisterEventCallback(callBack, param);
}
我是这样使用它的:
TdiapiFacade.RegisterEventCallback(OnTdiCallBack, IntPtr.Zero);
public void OnTdiCallBack(IntPtr ptr, IntPtr param)
{
}
RegisterEventCallback() 似乎工作成功,但在应该调用回调函数的地方,应用程序崩溃了。如您所见,在这个阶段我什至没有解开提供给回调函数的参数。
我需要做什么才能完成这项工作?
【问题讨论】:
-
与您的断言相反,C 代码没有声明任何函数。如果它完全是有效的 C(这对我和 CDECL 来说似乎很可疑),那么它将
T_TED_AcppBoxDYN_RegisterEventCallback声明为函数 type 的 alias。也许它是有效的 C++,但即使在这种情况下,它也必须声明一个类型别名,而不是该类型的实际函数或函数指针。 -
STATUS是如何定义的? -
您不能直接从 C# 调用非托管 C++ 实例函数。因为您没有
this指针。此外,您的TDICallback代表必须是 Cdecl。您将需要[UnmanagedFunctionPointer(CallingConvention.Cdecl)]属性。见stackoverflow.com/questions/5155180/… -
typedef int STATUS; //!
-
@Jim:他试图调用的函数似乎不是成员函数。