DLL接口如下:int testfunction(char* A,char* B,char* C,char** D),其中,D是个返回参数。求教一下在C#中用DLLImport调用这个DLL,应该怎样做才能给这几个参数赋值并且获取到testfunction和参数D的返回值?还需要做垃圾回收吗?谢谢先!
解决方案 »
- DataGrid格式化字符
- 在C#winform中如何关闭指定窗体?
- 使用File.Delete(fileName)时提示“拒绝存取路径”
- winform 中的DataGrid 可以添加checkbox吗?在线等,急用
- 怎么访问这个函数
- 用OLEDB读取excel数据,如果读取第一张表
- 100分高分请教关于如何设置DataGridView的列自适应大小!
- aspx中关于<%=... %>和<%#...%>的困惑
- datagridview问题,大家来看看 大家帮帮忙啊!!!
- 关于MDI问题,100分求助
- foreach 语句无法在“方法组”上执行?
- DEV TREELIST,他有SELECTED事件吗
int testfunction(StringBuilder A,StringBuilder B,StringBuilder C,ref string d);
调用的地方实参类型为IntPtr,调用处加上out修饰
执行完后用Marshal.PtrToStringAnsi将数据转换为string
A、B、C看来仅仅是传入的,就写作string就可以了,D要传出,并且是**的,看来内存是在这个函数内部分配的。
所以可以写成
int testfunction(string A,string B,string C,out IntPtr D);但是D的内存现在没法释放,我还不知道在c#中如何释放这样的内存
=====================================
WORD ushort
DWORD uint
UCHAR int/byte 大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte
UCHAR* string/IntPtr
unsigned char* Intptr
char* string
LPCTSTR string
LPTSTR [MarshalAs(UnmanagedType.LPTStr)] string
long int
ulong uint
Handle IntPtr
HWND IntPtr
void* IntPtr
int int
int* ref int
*int IntPtr
unsigned int uint
COLORREF uint
但他这个函数也有点那个,既然是调用方分配内存,char*就可以了,非写个**,多此一举。
{
if (obj != null) Marshal.ReleaseComObject(obj);
obj = null;
}
如果A B C中有的参数在函数中会改变的话,使用StringBuilder。关于D参数,20楼讲的很清楚了,我这里补充一句就是这些都是函数声明的地方的写法,调用的时候注意如果使用了ref或者out关键字,调用的时候就要带上这个关键字一起。