最近拿到一個(gè)第三方廠家的庫(kù),由于Delphi的同事看不懂c++的例子,所以讓我用C++封裝一個(gè)簡(jiǎn)單的Wrapper給其調(diào)用。
后來(lái)發(fā)現(xiàn)一個(gè)問(wèn)題,由于原始的函數(shù)聲明中的參數(shù)使用字符數(shù)組 (char szData[MAX_PATH]) 而不是用常用的指針(char *),給Delphi同事調(diào)用后,發(fā)現(xiàn)函數(shù)調(diào)用完退棧時(shí)候程序本潰,原因是訪問(wèn)違例,非法地址訪問(wèn)0x72。
這么一來(lái)感覺(jué)比較奇怪,0x72 這個(gè)地址顯然是個(gè)垃圾地址,一般如果是空指針的話因該是 0x00,如果是野指針,一般也不至于會(huì)那么小,0x72與程序加載地址都相去甚遠(yuǎn)。
在vc6(公司只準(zhǔn)用vc6)里跟了一下反匯編,感覺(jué)信息缺少比較多,能看到的地方已經(jīng)堆棧被破壞了。于是用了OD跟一下。發(fā)現(xiàn)Delphi調(diào)用我封裝的
函數(shù)時(shí),明明2個(gè)入?yún)ⅲ瑓s傳入了3個(gè)。多傳了個(gè)260。260對(duì)于vc程序員應(yīng)該比較熟悉了,就是MAX_PATH的值。于是乎,告知了Delphi程序
員,方才得知,原來(lái)Delphi是可以在聲明時(shí)指定數(shù)組長(zhǎng)度的,也就是說(shuō),函數(shù)的入?yún)ⅲ瑪?shù)組和指針是兩種聲明,如此一來(lái),水落石出了。