MASM32
我正在开发一个 win32 程序集 ( )中的串口 dll 。它有自己的线程检查多个事件,并在指定的缓冲区阈值时通过调用回调函数通知托管主应用程序。这只是一个没有参数/返回值的调用。
在启动时,主应用程序通过调用 dll 中的函数来存储回调函数的地址:
pCallBackFunction dd 0
SetCallBackPointer proc pcb:DWORD
mov eax, pcb
mov pCallBackFunction, eax
call DWORD ptr pCallBackFunction ; verify it immediately
ret
SetCallBackPointer endp
上层函数立即回调托管应用程序回调例程以进行验证。它工作正常。但是,当我将调用指令放在 dll 中的其他函数时,它会使应用程序崩溃。调用是在简单函数中还是在 dll 的 threadproc 中都没有关系。例如:
OpenPort proc pn:byte,br:dword, inputbuffersize: dword, outputbuffersize:dword, thresholdsize: dword
LOCAL dcb: DCB
LOCAL SerialTimeOuts: COMMTIMEOUTS
call DWORD ptr pCallBackFunction
xor eax, eax
mov al, pn
mov [com_port+3],al
etc. etc.
总是会在调用 DWORD ptr pCallBackFunction 时崩溃。由于我首先调用 SetCallBackPointer 将有效地址存储在 pCallBackFunction 中,因此它应该具有有效地址。
我的托管应用程序是用 C# 编写的,相关部分是:
public partial class Form1 : Form
{
public delegate void CallBackDelegate();
public static CallBackDelegate mydelegate;
[DllImport("serialport.dll")]
private static extern void SetCallBackPointer(CallBackDelegate Delegate);
[DllImport("serialport.dll")]
public static extern int OpenPort(byte com, uint br, uint inbufsize, uint outbufsize, uint threshsize);
public Form1()
{
InitializeComponent();
mydelegate =new CallBackDelegate(CallbackFunction);
SetCallBackPointer(mydelegate);
unsafe
{
int sysstat;
int hResult;
hResult = OpenPort(Convert.ToByte('5'), 9600, 306, 4, 4);
}
}
public static void CallbackFunction()
{
MessageBox.Show( "CallBack Function Called by Windows DLL");
}
VS 调试器报告该 dll 试图读取/写入受保护的内存地址。但是调用 SetCallBackPointer 时就没有这样的问题了。我在这里做错了什么?
任何提示都会很棒!