最近拿到一个第三方厂家的库,由于Delphi的同事看不懂c++的例子,所以让我用C++封装一个简单的Wrapper给其调用。
后来发现一个问题,由于原始的函数声明中的参数使用字符数组 (char szData[MAX_PATH]) 而不是用常用的指针(char *),给Delphi同事调用后,发现函数调用完退栈时候程序本溃,原因是访问违例,非法地址访问0x72。
这么一来感觉比较奇怪,0x72 这个地址显然是个垃圾地址,一般如果是空指针的话因该是 0x00,如果是野指针,一般也不至于会那么小,0x72与程序加载地址都相去甚远。
在vc6(公司只准用vc6)里跟了一下反汇编,感觉信息缺少比较多,能看到的地方已经堆栈被破坏了。于是用了OD跟一下。发现Delphi调用我封装的
函数时,明明2个入参,却传入了3个。多传了个260。260对于vc程序员应该比较熟悉了,就是MAX_PATH的值。于是乎,告知了Delphi程序
员,方才得知,原来Delphi是可以在声明时指定数组长度的,也就是说,函数的入参,数组和指针是两种声明,如此一来,水落石出了。