簡體   English   中英

在不受管理的C-DLL中使用C#中的函數(AccessViolationException)

[英]Use functions in C# from unmanaged C-DLL (AccessViolationException)

我有一個帶有簡短文檔的C-DLL,我想在我的C#程序中使用此DLL。

不幸的是,文檔是針對受密碼保護的Excel-Makro的,因此我不知道確切的函數名稱和參數類型。

我使用DependencyWalker來查找DLL的所有導出功能,並與文檔一起我發現,所記錄的函數ptx在DLL中稱為FU_PTX ,並且期望一個參數並具有返回值。 不幸的是,我仍然不知道參數的類型或返回值,但我知道它是一個數字。

所以我寫了下面的代碼:

...
        [DllImport("dmata.dll")]
        public static extern UInt32 FU_PTX(UInt32 x);

        FU_PTX(11); 
...

此代碼引發AccessViolationException 我也嘗試了其他類型,如intlongdouble,但是我總是遇到相同的異常。

據我所知,沒有辦法直接從dll中獲取所需的類型,但也許任何人都知道有什么問題或可以向正確的方向指出。


編輯:

我設法從vba文件獲取簽名:

Private Declare Function FU_PTX# Lib "dmata.dll" (FT#)

我將其移植到以下C#代碼:

[DllImport("dmata.dll")]
public static extern double FU_PTX(double x);


FU_PTX(1.5);

我仍然收到相同的AccessViolationException 有人知道為什么我仍然會遇到同樣的異常嗎?

這個語法:

Private Declare Function FU_PTX# Lib "dmata.dll" (FT#)

#后綴的使用比較晦澀; 在“現代” VBA中(如果可以說是這樣的話),聲明將是

Private Declare Function FU_PTX Lib "dmata.dll" (ByRef FT As Double) As Double

注意不幸的是默認的ByRef ; 默認情況下,參數是通過VBA中的引用傳遞的(即使該函數無意修改它們)。

這應與以下C#聲明相對應:

[DllImport("dmata.dll")]
public static extern double FU_PTX(ref double FT);

由於參數是通過引用傳遞的,因此您不能傳遞常量,而必須始終使用變量:

double ft = 11.0;
FU_PTX(ref ft);

暫無
暫無

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

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