簡體   English   中英

DLL調用期間的奇怪AV

[英]Strange AV during DLL call

我在D7中創建了一個示例項目,展示了這個奇怪的問題。 它在這里: http//speedy.sh/n9Etr/OpenCV-BugTest.zip

我有一個看起來像這樣的程序:

function Rec (image: PIplImage): String;
begin
  DLL_CALL;
end;

當我調用Rec時,我在DLL_CALL上獲得AV,但是......如果我將第二個參數添加到函數中:

function Rec (image: PIplImage; Something: String): String;
begin
  DLL_CALL;
end;

然后DLL_CALL成功。

變量:'Something'無關緊要,不在任何地方......

真的,我不知道發生了什么......

編輯:

我使用openCV庫的cvSaveImage。

function cvSaveImage(const filename: PAnsiChar; const image: pointer): integer; 
    cdecl; external CV_HIGH_GUI_DLL;

我的所有方法都使用cdecl param的調用約定導出。

完整的程序是:

function TCVR.Rec(image: PIplImage): String;
const
  THRESH = 50;
var
  imgDisorted: PIplImage;
  Storage: PCvMemStorage;
  Squares: PCvSeq;

begin
  imgDisorted := nil;
  result := '';

  Storage := cvCreateMemStorage(0);

  cvSetImageROI(image, cvRect(0, 0, image^.width and -2, image^.height and -2));
  PyrDownUp(image);
  cvSetImageROI(image, cvRect(0, 0, image^.width and -2, image^.height and -2));

  imgDisorted := cvCreateImage(cvSize(image^.width and -2, image^.height and -2), 8, 1);
  cvSaveImage('c:\test.jpg', image); <--- AV here only when I have 1 parameter in my Rec.
end;

您正在使用具有2.4.1 DLL版本的1.0函數定義。 功能定義發生了變化,因此您將近三年過時。 特別是, cvSaveImage需要三個參數 ,而不僅僅是兩個參數 2.0版本的摘錄:

CVAPI(int) cvSaveImage( const char* filename, const CvArr* image,
                        const int* params CV_DEFAULT(0) );

更新您的DLL導入單元以匹配您正在使用的DLL(或切換到該庫的舊版本)。 我會將這個函數翻譯成Delphi,如下所示:

function cvSaveImage(filename: PAnsiChar; image: PCvArr; params: PInteger = nil); cdecl;

這就是為什么你會遇到你遇到的特殊失敗的原因:

DLL不知道您只傳遞了兩個參數,因此它從它認為是第三個參數的內容中讀取並將其解釋為指向整數數組的指針。 無論什么真的可能根本沒有指針,所以你得到一個訪問沖突。

Rec函數中添加另一個參數會使其具有四個參數( SelfimageSomethingResult ),這會將其中一個參數強制到堆棧中。 由於堆棧稍大,DLL最終會從不同的位置讀取。 該位置可能包含空指針,因此DLL不會嘗試讀取任何數組元素,因此代碼按預期工作。

檢查你的dll的import聲明。 可能這個dll的界面已經改變了,但是你的代碼沒有反映出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM