2012-12-11 150 views
4

我在c#應用程序中使用c dll時遇到了一些麻煩。這給了我一個錯誤的功能是在DLL中像這樣的頭文件中定義:從C傳遞字符串到c dll#

int __stdcall DDC_CreateFilePropertyString (DDCFileHandle file, 
             const char *property, 
             const char *value); 

我在我的課,我訪問的dll添加以下代碼。

[DllImport("nilibddc.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Ansi)] 
private static extern int DDC_CreateFilePropertyString(IntPtr file, 
         [MarshalAs(UnmanagedType.LPStr)]string property, 
         [MarshalAs(UnmanagedType.LPStr)]string value); 

的類型DDCFileHandle在頭文件中定義是這樣的:

typedef struct _DDCFile DDCFile; 
typedef DDCFile* DDCFileHandle; 

有大約在頭文件中的_DDCFile結構沒有任何額外的信息(我沒有從任何其他文件圖書館即時通訊使用)。

在我調用函數DDC_CreateFilePropertyString()之前,我調用以下函數來創建一個文件並獲取文件句柄。

[DllImport("nilibddc.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Ansi] 
private static extern int DDC_CreateFile(char[] filePath, 
          char[] fileType, 
          char[] name, 
          char[] description, 
          char[] title, 
          char[] author, 
          ref IntPtr file); 

頭文件中的定義如下所示。

int __stdcall DDC_CreateFile (const char *filePath, 
          const char *fileType, 
          const char *name, 
          const char *description, 
          const char *title, 
          const char *author, 
          DDCFileHandle *file); 

現在總是當我調用函數DDC_CreateFilePropertyString返回我一個錯誤,告訴我,我已經通過了一些錯誤的參數。我究竟做錯了什麼?我使用的庫是National instruments的TDMS C API。

感謝您的幫助。

+1

對'DDC_CreateFile'的調用是否成功?你怎麼知道的?並且它的'const char *'參數是否也不作爲'string'(與'DDC_CreateFilePropertyHandle'相同)而不是'char []'傳遞?你的DLL函數也被聲明爲'stdcall',所以你必須改變你的pinvoke聲明中的'cdecl'調用約定。 – shambulator

+0

是的,它確實成功。返回碼是好的。如果我只是調用'DDC_CreateFile'函數,它會正確地在文件系統中創建文件。我將'char'改爲'string','cdec1'改爲'stdcall',但我仍然得到錯誤。 – Devkev

回答

2

您的p /調用有點關閉。您需要使用CallingConvention.Stdcall,這是默認設置。而對於const char*參數,您應該簡單地在C#結束時將它們聲明爲string

正確的C#的P/Invoke的DDC_CreateFile是:

[DllImport("nilibddc.dll", CharSet=CharSet.Ansi] 
private static extern int DDC_CreateFile(
    string filePath, 
    string fileType, 
    string name, 
    string description, 
    string title, 
    string author, 
    ref IntPtr file 
); 

併爲DDC_CreateFilePropertyString,你需要這樣的:

[DllImport("nilibddc.dll", CharSet=CharSet.Ansi)] 
private static extern int DDC_CreateFilePropertyString(
    IntPtr file, 
    string property, 
    string value 
); 

如果修復您的代碼後,你仍然調用這些函數時收到錯誤,那麼你顯然不正確地使用該庫。這超出了這個問題的範圍。查閱文檔,和/或尋求圖書館供應商的支持。

+0

非常感謝您的幫助!我試過了,但沒有奏效。我要聯繫供應商。謝謝! – Devkev

相關問題