簡體   English   中英

Delphi / C ++ DLL問題-unsigned long vs unsigned int?

[英]Delphi/C++ DLL problem - unsigned long vs unsigned int?

(已解決:請參見自我答復。感謝回答者)。

我將C ++ DLL動態加載到我的Delphi 6 Pro程序中時遇到了一個奇怪的問題。 DLL中的函數調用之一是:

__declspec(dllexport)int foo(unsigned int A,無符號長bitsetVector);

我在Delphi函數中將函數指針轉換為:

foo:function(A:LongWord; bitsetVector:LongWord):整數; stdcall;

我映射到DLL的幾乎所有其他調用都可以正常工作,但是此調用返回“無效位集字段”錯誤,表明它不喜歡bitsetVector值。 通過使用OR運算符設置位來構建bitsetVector參數。 當然,用於設置位的所有枚舉常量均為2的冪。 我很確定這是某種類型的強制轉換錯誤,所以我想知道我不知道“ unsigned int”與“ unsigned long”之間是否存在細微差別。 MSDN C ++文檔將它們都顯示為4個字節,范圍從0到4,294,967,295,因此它們對我來說看起來是相同的。

Bizarro注意。 我嘗試運行范圍為0到100的for循環,在這里我剛剛將for迭代器變量(i)作為位集向量傳遞。 所有奇數均失敗,而所有偶數均成功。 這就是為什么我覺得這是一個轉換錯誤。 注意,我沒有損壞或內存錯誤。 我對FastMM4進行了全面檢查,盡管有幾個DLL調用接收到LongWord參數,並且通常“出”參數通常在DLL集成不匹配中首先遭受損失,但是沒有堆棧崩潰或堆損壞。 另外,我從C ++ DLL中獲得的值看起來也不錯。

我想知道,如果外面有人對此有任何想法或想法,或者可能有一些切向知識可以揭示真正的問題(如果不是鑄造問題)。

謝謝。

感謝那些回應。 事實證明,這是症狀真正令人誤解的情況之一。 真正的問題是,用於設置位的第一個枚舉常量在調用的上下文中當然是非法的,該位的值當然為1。 這就是為什么只有“偶數”位集值成功的原因。 完全是因為不存在非法的枚舉值。 事實證明DLL鏈接是正確的。

暫無
暫無

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

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