
用Intptr吧。
昨天试了一下,char**你可以定义成IntPtr数组,如果只是输入不是输出还可以定义成string数组。
这是我的测试:
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void HelloWorld (char** str)
{
MessageBox (0, *str, "Hi", MB_ICONINFORMATION)
MessageBox (0, *(str+1), "Hi", MB_ICONINFORMATION)
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break
case DLL_PROCESS_DETACH:
break
case DLL_THREAD_ATTACH:
break
case DLL_THREAD_DETACH:
break
}
/* Returns TRUE on success, FALSE on failure */
return TRUE
}
-----------------------------------------------------------------
using System
using System.Collections.Generic
using System.Linq
using System.Text
using System.Runtime.InteropServices
namespace char星星
{
class Program
{
[DllImport("charintptr.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void HelloWorld(IntPtr[] str)
static void Main(string[] args)
{
IntPtr[] sbs = new IntPtr[2]
sbs[0] = Marshal.StringToHGlobalAnsi("test1")
sbs[1] = Marshal.StringToHGlobalAnsi("test2")
HelloWorld(sbs)
Console.ReadKey()
}
}
}
---------------------------------------------------
首先C语言的外部库要按照接口标准,将接口留出来,参考网址如下:
C语言dll文件的说明以及生成、使用方法网页链接
制作C/C++动态链接库(dll)若干注意事项网页链接
如果只有DLL而没有源代码,不能自己编译的话,需要查询DLL的接口是什么样子的,可以使用下面的工具去查询:
DLL分析的非常好用的工具(Dependency Walker 2.2)网页链接
Dependency Walker使用说明网页链接
接下来,就可以在C#中进行C语言DLL的调用了,主要使用System.Runtime.InteropServices下的DllImport,参考网址如下:
C#直接使用DllImport外部Dll的方法网页链接
从托管应用程序调用非托管代码网页链接
另外特别要说明的是,如果你的C语言的DLL里面使用了指针 *** 作,虽然可以使用ref的方式接收传入的数据(参考网址网页链接),但是我非常非常非常推荐你使用unsafe的方式去处理指针 *** 作(参考网址网页链接),因为1、如果你的C语言DLL里面有内存 *** 作错误,C#也没法去修复,2、使用unsafe的指针 *** 作会比使用托管的ref *** 作效率高很多(当对效率要求非常高的时候)。
PS:网上资料很多,我列出来的资料也是现查的,你可以根据我写的内容,在网上自行搜索,寻找适合自己的资料。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)