我在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。
感謝您的幫助。
對'DDC_CreateFile'的調用是否成功?你怎麼知道的?並且它的'const char *'參數是否也不作爲'string'(與'DDC_CreateFilePropertyHandle'相同)而不是'char []'傳遞?你的DLL函數也被聲明爲'stdcall',所以你必須改變你的pinvoke聲明中的'cdecl'調用約定。 – shambulator
是的,它確實成功。返回碼是好的。如果我只是調用'DDC_CreateFile'函數,它會正確地在文件系統中創建文件。我將'char'改爲'string','cdec1'改爲'stdcall',但我仍然得到錯誤。 – Devkev