C#调用DLL指针返回值的问题

[复制链接]
查看11 | 回复2 | 2016-10-16 23:46:45 | 显示全部楼层 |阅读模式
用C++写的DLL,接口如下
extern "C" __declspec(dllexport) int GetWaterMark(char *srcfile ,int key, char **watermark)//添加水印
第一个参数是文件名字,第二个参数是密钥,第三个是返回的字符串
这是我写的调用DLL的
[DllImport("DllWatermark.dll", ExactSpelling = false, SetLastError = true, CharSet = CharSet.Ansi)]

//提取水印

public static extern bool GetWaterMark(System.String srcfile2, int key,StringBuilder watermark);
IntPtr p =new IntPtr (256);
GetWaterMark(fullname2, 0,p);
Response.Write("密级为" + p);
说是尝试写出受保护的内存,内存可能损坏。
请问char **在c#怎么调用呢?
GetWaterMark(fullname2, 0, &p);
错误信息:指针和固定大小缓冲区只能在不安全的上下文中使用
行 22:
[DllImport("DllWatermark.dll", ExactSpelling = false, SetLastError = true, CharSet = CharSet.Ansi)]
行 23:
//提取水印
行 24:
public static extern bool GetWaterMark(System.String srcfile2, int key, IntPtr* watermark);

回复

使用道具 举报

千问 | 2016-10-16 23:46:45 | 显示全部楼层
char** 代表char的二级指针,在C中,二级指针与二维数组是划等号的,那么就是指char的二维数组,而char*代表字符串,那么char**就可以等价于字符串数组,C#中就代表string[]这个类型,不过这里情况不同,第三个参数是一个输出参数,所以还是用char[][]比较好,API函数可以转化为如下C#函数: int GetWaterMark(string srcfile ,int key, ref char[][] watermark) 你调用的时候只给一个int指针过去,他要回一个庞大的二维数组给你,出现内存溢出是肯定的,C#的内存管理可没有C那么自由,即使是C你也要malloc一下吧...
回复

使用道具 举报

千问 | 2016-10-16 23:46:45 | 显示全部楼层
GetWaterMark(fullname2, 0, &p); 试试 ---------------- 忘记C#不能用指针了.. jayasme的应该可以吧?...又学到一点..------------jayasme--!VC用习惯了...前些天用C#都要疯了..没指针,还不能默认参数...!!...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行