回调函数执行6次以后,结尾的时候报访问越界错误?求解了

wangwei244157887 2011-05-29 01:07:43
每一次报错都是执行6次以后,然后跳出CPU的DEBUG界面,然后看不懂那个汇编指令,想请教一下,下面的什么意思,我摘抄一段

mov ecx,[ebp+$08];
xor eax,eax
cmp eax,[ecx+$04] //这句话报错
jnbe +$000000cb
jb +$0c


出错的,不知道什么意思?请教大家了
...全文
613 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-05-29
  • 打赏
  • 举报
回复
这是我声明的回调函数:

function EveryNCallback(TaskHandle:Pointer;everyNsamplesEventType:Integer;nSamples:Cardinal;callbackData:Pointer):Integer;stdcall;


下面是调用回调函数的过程

DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,100,0,EveryNCallback,nil)


DAQmxRegisterEveryNSamplesEvent函数的原型为

function DAQmxRegisterEveryNSamplesEvent(ATaskHandel:TaskHandle;everyNsamplesEventType:Integer;nSamples,options:Cardinal;
callbackFunction:TEveryNCallback;CallBackData:Pointer):Integer;stdcall;external 'nicaiu.dll'


其中TEveryNCallback声明为

TEveryNCallback=function(ATaskHandel:TaskHandle;everyNsamplesEventType:Integer;nSamples:Cardinal;CallBack:Pointer):Integer;stdcall;


都加了stdcall约定



SQLDebug_Fan 2011-05-29
  • 打赏
  • 举报
回复
eax是函数返回值,看看回调函数有没有加stdcall约定。
「已注销」 2011-05-29
  • 打赏
  • 举报
回复
唉,不知道为什么采样这种回调方式,反而没以前的方法好,回调函数是被动采集数据,以前是主动采集数据,不知道和系统的快慢有没有关系
「已注销」 2011-05-29
  • 打赏
  • 举报
回复
三国谢谢你,应该是的啦,我后来也想到是我的声明错误,不过,改了以后,遇到一些的别的问题,不过函数终于不报错了
sanguomi 2011-05-29
  • 打赏
  • 举报
回复
CVICALLBACK 你确定下它的定义是什么, 是cdecl 还是stdcall

#define CVICDECL __cdecl

/* CVICALLBACK is used for typdefs for ptrs to functions. For example:
* typedef void (CVICALLBACK * MenuDimmerCallbackPtr)(int menuBar, int panel);
*/
#define CVICALLBACK CVICDECL

我google的是这样定义的。

int32 DAQmxRegisterEveryNSamplesEvent (TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, uInt32 options, DAQmxEveryNSamplesEventCallbackPtr callbackFunction, void *callbackData);

这样应该就是C默认的cdecl , 不是STDCALL
「已注销」 2011-05-29
  • 打赏
  • 举报
回复
恩,我现在调用的是C的函数库然后翻译的,
下面是C的原型

int32 DAQmxRegisterEveryNSamplesEvent (TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, uInt32 options, DAQmxEveryNSamplesEventCallbackPtr callbackFunction, void *callbackData);

其中的callbackFunction DAQmxEveryNSamplesEventCallbackPtr 是一个回调函数具体声明如下:

int32 CVICALLBACK Callback (TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);

Upon entry to the callback, the taskHandle parameter contains the handle to the task on which the event occurred. The everyNSamplesEventType parameter contains the value you passed in the everyNSamplesEventType parameter of this function. The nSamples parameter contains the value you passed in the nSamples parameter of this function. The callbackData parameter contains the value you passed in the callbackData parameter of this function.



int32 CVICALLBACK Callback (TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);


我想知道上面这个回调函数是怎么声明的,我现在在DELPHI里面是这样声明的



TEveryNCallback=function(ATaskHandel:TaskHandle;everyNsamplesEventType:Integer;nSamples:Cardinal;CallBack:Pointer):Integer;stdcall;


请问哪里有错误吗?
sanguomi 2011-05-29
  • 打赏
  • 举报
回复
接口标准的函数原型是什么?
bdmh 2011-05-29
  • 打赏
  • 举报
回复
比较,很可能你的ecx+$04已经不存在或无效
「已注销」 2011-05-29
  • 打赏
  • 举报
回复

mov ecx,[esi+$04]
push ecx
jz +$0c
call eax
add dword ptr [esp+$10],$01
jmp -$000000ac
call eax
add esp,$10
add dword ptr [esp+$10],$01 //出错的时候跳到这行
jmp -$00000bb
dinoalex 2011-05-29
  • 打赏
  • 举报
回复
mov ecx,[ebp+$08]; // ecx:= ebp+$08
xor eax,eax // 位运算
cmp eax,[ecx+$04] // 应该是对比
jnbe +$000000cb
jb +$0c
「已注销」 2011-05-29
  • 打赏
  • 举报
回复


现在我在回调函数中不添加,任何语句,还是报错,

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧