首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有char**和DLLImport **的DLLImport

使用带有char**和DLLImport **的DLLImport
EN

Stack Overflow用户
提问于 2013-10-14 14:16:44
回答 1查看 1.5K关注 0票数 1

我试图使用C#程序中的DLL文件使用DLLImport。我在DLL中有以下函数:

代码语言:javascript
复制
int method(char* method, char** params, int n_params, float** res_arr, int* n_res);

函数调用应该如下所示:

代码语言:javascript
复制
method   = "method1"
char**   = {"param1=1", "param2=2"}
n_params = 2
res_arr  = the DLL function allocates an array and points this to it
n_res    = the DLL function sets to the number of results

有一个单独的函数来释放浮点数**。

我在C#中的当前代码是:

代码语言:javascript
复制
private static extern int method(string method, ref IntPtr params, Int32 n_params, ref IntPtr res_arr, IntPtr n_res);

我对C#很陌生(而且我的C知识有点缺乏),在我的生活中,我可能不知道如何调用这个函数(我的键盘已经有两天了)。有人能给我举个例子,说明该如何做以及如何调用函数吗?

我的主要问题是如何处理char**float**,我不知道它是否是声明中正确的指针类型,也不知道该如何创建和发送float**到函数。

值得注意的是,我不能更改DLL文件中的任何内容。

编辑

这是对释放结果数组的函数的描述:

free_results(float* res_arr)

EDIT2 --我现在可以调用该方法并获得值,我现在的问题是,我似乎在访问浮点值时遇到了问题。正如建议的那样,我像这样使用Marshal.Copy()

代码语言:javascript
复制
[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res);

IntPtr res_arr = IntPtr.Zero;  
int n_res = 0;
string[] s = new string[] { "param1" };  

method("analyze", s, s.Length, out res_arr, ref n_res);  

float[] f_res = new float[n_res];
Marshal.Copy(res_arr, f_res, 0, n_res);

问题是我似乎只得到浮点向量中的垃圾值。例如,在一种情况下,我应该得到100.0,但得到15.03840.0,这告诉我,我在复制时使用指针错误,或者有其他可疑的东西。DLL中的代码正在正常工作,因为还有另一个用C编写的程序,它得到了正确的值。这感觉就像我做了一个浮动指针,而不是它所指的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-16 09:40:09

这是解决我最初问题的代码(如Hans Passant所建议的):

代码语言:javascript
复制
[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res);

IntPtr res_arr = IntPtr.Zero;  
int n_res = 0;
string[] s = new string[] { "param1" };  

method("analyze", s, s.Length, out res_arr, ref n_res);  

float[] f_res = new float[n_res];
Marshal.Copy(res_arr, f_res, 0, n_res);

我的第二个问题,浮子数组给出了垃圾值,是因为我是一顶完整的驴帽。在使用method(...)之前,必须调用DLL中的另一个函数,以便使其具有要处理的值。在添加了那个电话之后,一切都运转得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19362338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档