最近在編寫一個有關於圖像處理的簡單程序,但是居然碰見了下面的怪問題.
我封裝了一個CDib類來完成對Bitmap的讀取(我給她單獨建立了一個DLL文件),並且解析Bitmap文件,就是分別找出File Header,Info Header等等,由於需要分配比較多的內存,所以我還在類中建立了一個Heap,來進行管理內存分配,那麼這個文件編譯連接都已經通過.
但是我連接到主程序使用的時候,問題就來了,我使用這個類來讀取文件的時候,就出現了非法訪問內存空間的問題,原來我還以為是DLL文件的問題,但是跟蹤發現,類中的Read函數正常運行,並沒出現甚麼非法訪問的問題,但是我在主程序中就出現了,如下
CDib dib;
TCHAR tchPath[]="tt.bmp";
BOOL aa=dib.Read(tchPath); //錯在這兒,這兒居然出現了非法訪問內存的錯誤.於是我又返回到DLL文件的CDib類中,在Read函數的最後一句話return TRUE之前,檢測程序是否能正常運行,結果是在這個語句之前,沒出現甚麼問題,但是一旦返回值,就出現了非法訪問的錯誤,我使用SoftICE跟蹤過,語句如下
mov edi,[ebx] //錯在這兒了,非法訪問的地址來自於DLL地址空間
但是為甚麼,我在return TRUE這個語句之前就沒出現問題,偏偏執行到return TRUE的時候出現問題呢.
但是,我現在想不通怎麼一返回值就出錯,沒返回的時候不出錯呢.
希望高手大力指教,謝謝先.
我封裝了一個CDib類來完成對Bitmap的讀取(我給她單獨建立了一個DLL文件),並且解析Bitmap文件,就是分別找出File Header,Info Header等等,由於需要分配比較多的內存,所以我還在類中建立了一個Heap,來進行管理內存分配,那麼這個文件編譯連接都已經通過.
但是我連接到主程序使用的時候,問題就來了,我使用這個類來讀取文件的時候,就出現了非法訪問內存空間的問題,原來我還以為是DLL文件的問題,但是跟蹤發現,類中的Read函數正常運行,並沒出現甚麼非法訪問的問題,但是我在主程序中就出現了,如下
CDib dib;
TCHAR tchPath[]="tt.bmp";
BOOL aa=dib.Read(tchPath); //錯在這兒,這兒居然出現了非法訪問內存的錯誤.於是我又返回到DLL文件的CDib類中,在Read函數的最後一句話return TRUE之前,檢測程序是否能正常運行,結果是在這個語句之前,沒出現甚麼問題,但是一旦返回值,就出現了非法訪問的錯誤,我使用SoftICE跟蹤過,語句如下
mov edi,[ebx] //錯在這兒了,非法訪問的地址來自於DLL地址空間
但是為甚麼,我在return TRUE這個語句之前就沒出現問題,偏偏執行到return TRUE的時候出現問題呢.
但是,我現在想不通怎麼一返回值就出錯,沒返回的時候不出錯呢.
希望高手大力指教,謝謝先.
不知道這有沒影響.
因為Read函數只是CDib類中的一個成員函數而已,沒甚麼需要釋放的內存,除了分配在Heap中的內存空間.
問題是整個函數沒出現執行錯誤,居然錯在最後一句,
return TRUE
因為上面的返回語句執行完畢之後,就是下面的語句了.
BOOL aa=dib.Read(tchPath); //錯在這兒,這兒居然出現了非法訪問內存的錯誤.
我覺得你說的比較擊中要害,我仔細看看.
我试过了静态调用就可以.动态跨Module的就不行(估计和地址空间映射有关)