C#labview调用dllC++编写的DLL,下面怎么转换类型的,各位大侠帮忙看下,谢谢!!!

C#如何调用C++编写的dll中的导出类
[问题点数:50分,结帖人xinxzhao]
C#如何调用C++编写的dll中的导出类
[问题点数:50分,结帖人xinxzhao]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。当前位置:&&
本页文章导读:
&&&&?c#中常用的js语句&&&&&&
1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document-&html-&(head,body) 4.一个浏览器窗口中的DOM顺序是:window-&(navigator,screen,history,location,document) 5.得到表单中元素的名......&&&&?asp.net+jquery Jsonp使用方法&&&&&&
代码如下: string callback = Request["callback"]; string response = string.Format("\"value1\":\"{0}\",\"value2\":\"{1}\", v1, v2); string call = callback + "({" + response + "})"; Response.Write(call);
客户端 这里使用JQ,有......&&&&?C#调用C++版本dll时的类型转换需要注意的问题小结&&&&&&
C#对于C++的dll引用时,经常会遇到类型转换和struct的转换 1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用;可使用c#里的byte对应 2. structType temp = (structType)Marshal.PtrToStruct......
&&&&&&最新IT科技资讯推荐:
[1]c#中常用的js语句
&&&&来源:&互联网& 发布时间:&
1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document-&html-&(head,body) 4.一个浏览器窗口中的DOM顺序是:window-&(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID號").name(或value) 6.一个小写转大写的JS: document.getElementById("output").value = document.getElementById("input").value.toUpperCase(); 7.JS中的值类型:String,Number,Boolean,Null,Object,Function 8.JS中的字符型转换成数值型:parseInt(),parseFloat() 9.JS中的数字转换成字符型:("" 变量) 10.JS中的取字符串长度是:(length) 11.JS中的字符与字符相连接使用 號. 12.JS中的比较操作符有:==等于,!=不等于,&,&=,&.&= 13.JS中声明变量使用:var来进行声明 14.JS中的判断语句结构:if(condition){}else{} 15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop} 16.循环中止的命令是:break 17.JS中的函数定义:function functionName([parameter],...){statement[s]} 18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替. 19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self 20.状態栏的设置:window.status="字符"; 21.弹出提示信息:window.alert("字符"); 22.弹出確认框:window.confirm(); 23.弹出输入提示框:window.prompt(); 24.指定当前显示链接的位置:window.location.href="URL" 25.取出窗体中的所有表单的数量:document.forms.length 26.关闭文档的输出流:document.close(); 27.字符串追加连接符: = 28.创建一个文档元素:document.createElement(),document.createTextNode() 29.得到元素的方法:document.getElementById() 30.设置表单中所有文本型的成员的值为空: var form = window.document.forms[0] for (var i = 0; i&form.elements.i ){ if (form.elements.type == "text"){ form.elements.value = ""; } } 31.复选按钮在JS中判断是否选中:document.forms[0].checkThis.checked (checked属性代表为是否选中返回TRUE或FALSE) 32.单选按钮组(单选按钮的名称必须相同):取单选按钮组的长度document.forms[0].groupName.length 33.单选按钮组判断是否被选中也是用checked. 34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有时用下拉列表框名称加上.selectedIndex来確定被选中的值) 35.字符串的定义:var myString = new String("This is lightsword"); 36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase(); 37.返回字符串2在字符串1中出现的位置:String1.indexOf("String2")!=-1则说明没找到. 38.取字符串中指定位置的一个字符:StringA.charAt(9); 39.取出字符串中指定起点和终点的子字符串:stringA.substring(2,6); 40.数学函数:Math.PI(返回圆周率),Math.SQRT2(返回开方),Math.max(value1,value2)返回两个数中的最在值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函数,Math.floor(Math.random()*(n 1))返回隨机数 41.定义日期型变量:var today = new Date(); 42.日期函数列表:dateObj.getTime()得到时间,dateObj.getYear()得到年份,dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期几,dateObj.getHours()得到小时,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTime(value)设置时间,dateObj.setYear(val)设置年,dateObj.setMonth(val)设置月,dateObj.setDate(val)设置日,dateObj.setDay(val)设置星期几,dateObj.setHours设置小时,dateObj.setMinutes(val)设置分,dateObj.setSeconds(val)设置秒 [注意:此日期时间从0开始计] 43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName 44.parent代表父亲对象,top代表最顶端对象 45.打开子窗口的父窗口为:opener 46.表示当前所属的位置:this 47.当在超链接中调用JS函数时用:(javascript :)来开头后面加函数名 48.在老的浏览器中不执行此JS:&!-- //--& 49.引用一个文件式的JS:&script type="text/javascript" src="aaa.js"&&/script& 50.指定在不支持脚本的浏览器显示的HTML:&noscript&&/noscript& 51.当超链和onCLICK事件都有时,则老版本的浏览器转向a.html,否则转向b.html.例:&a href="a.html" onclick="location.href='b.html';return false"&dfsadf&/a& 52.JS的內建对象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError 53.JS中的换行:\n 54.窗口全屏大小:&script&function fullScreen(){ this.moveTo(0,0);this.outerWidth=screen.availWthis.outerHeight=screen.availH}window.maximize=fullS&/script& 55.JS中的all代表其下层的全部元素 56.JS中的焦点顺序:document.getElementByid("表单元素").tabIndex = 1 57.innerHTML的值是表单元素的值:如&p id="para"&"how are &em&you&/em&"&/p&,则innerHTML的值就是:how are &em&you&/em& 58.innerTEXT的值和上面的一样,只不过不会把&em&这种標记显示出来. 59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状態. 60.isDisabled判断是否为禁止状態.disabled设置禁止状態 61.length取得长度,返回整型数值 62.addBehavior()是一种JS调用的外部函数文件其扩展名为.htc 63.window.focus()使当前的窗口在所有窗口之前. 64.blur()指失去焦点.与FOCUS()相反. 65.select()指元素为选中状態. 66.防止用户对文本框中输入文本:onfocus="this.blur()" 67.取出该元素在页面中出现的数量:document.all.tags("div(或其它HTML標记符)").length 68.JS中分为两种窗体输出:模態和非模態.window.showModaldialog(),window.showModeless() 69.状態栏文字的设置:window.status='文字',默认的状態栏文字设置:window.defaultStatus = '文字.'; 70.添加到收藏夹:external.AddFavorite("";,"jaskdlf"); 71.JS中遇到脚本错误时不做任何操作:window.onerror = doN 指定错误句柄的语法为:window.onerror = handleE 72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener...的多重继续. 73.JS中的self指的是当前的窗口 74.JS中状態栏显示內容:window.status="內容" 75.JS中的top指的是框架集中最顶层的框架 76.JS中关闭当前的窗口:window.close(); 77.JS中提出是否確认的框:if(confirm("Are you sure?")){alert("ok");}else{alert("Not Ok");} 78.JS中的窗口重定向:window.navigate(".cn";); 79.JS中的打印:window.print() 80.JS中的提示输入框:window.prompt("message","defaultReply"); 81.JS中的窗口滚动条:window.scroll(x,y) 82.JS中的窗口滚动到位置:window.scrollby 83.JS中设置时间间隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout 84.JS中的模態显示在IE4 行,在NN中不行:showModalDialog("URL"[,arguments][,features]); 85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue="we really like you and hope you will stay longer.";}} window.=verifyC 86.当窗体第一次调用时使用的文件句柄:onload() 87.当窗体关闭时调用的文件句柄:onunload() 88.window.location的属性: protocol(http:),hostname(),port(80),host(:80),pathname("/a/a.html"),hash("#giantGizmo",指跳转到相应的锚记),href(全部的信息) 89.window.location.reload()刷新当前页面. 90.window.history.back()返回上一页,window.history.forward()返回下一页,window.history.go(返回第几页,也可以使用访问过的URL) 91.document.write()不换行的输出,document.writeln()换行输出 92.document.body.noWrap=防止链接文字折行. 93.变量名.charAt(第几位),取该变量的第几位的字符. 94."abc".charCodeAt(第几个),返回第几个字符的ASCii码值. 95.字符串连接:string.concat(string2),或用 =进行连接 96.变量.indexOf("字符",起始位置),返回第一个出现的位置(从0开始计算) 97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置. 98.string.match(regExpression),判断字符是否匹配. 99.string.replace(regExpression,replaceString)替换现有字符串. 100.string.split(分隔符)返回一个数组存储值. 101.string.substr(start[,length])取从第几位到指定长度的字符串. 102.string.toLowerCase()使字符串全部变为小写. 103.string.toUpperCase()使全部字符变为大写. 104.parseInt(string[,radix(代表进制)])强制转换成整型. 105.parseFloat(string[,radix])强制转换成浮点型. 106.isNaN(变量):测试是否为数值型. 107.定义常量的关键字:const,定义变量的关键字:var 108.从iframe中跳出:parent.location.href="index.html"
[2]asp.net+jquery Jsonp使用方法
&&&&来源:&互联网& 发布时间:&
代码如下: string callback = Request["callback"]; string response = string.Format("\"value1\":\"{0}\",\"value2\":\"{1}\", v1, v2); string call = callback + "({" + response + "})"; Response.Write(call);
客户端 这里使用JQ,有下面两种调用方法: 1、使用getJson
代码如下: var url = "xxx.aspx?p1=1&p2=2&callback=?"; jQuery.getJSON(url, function(data) { alert("value1:" + data.value1+ " value2:" + data.value2); });
2、使用ajax
代码如下: jQuery.ajax({ type:"get", url: "xxx.aspx", dataType : "jsonp", jsonp: "callback", data: "p1=1&p2=2&callback=?", success:function(msg){ alert("value1:" + data.value1+ " value2:" + data.value2); } });
[3]C#调用C++版本dll时的类型转换需要注意的问题小结
&&&&来源:&互联网& 发布时间:&
C#对于C++的dll引用时,经常会遇到类型转换和struct的转换 1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用;可使用c#里的byte对应 2. structType temp = (structType)Marshal.PtrToStructure(IntPtr, typeof(structType));说明:此方式转换只针对包含c++基本类型的结构体,如果包含指针数组的结构体,使用泛型函数比较方便。 3. [StructLayoutAttribute(LayoutKind.Sequential)] 说明:StructLayoutAttribute 类 使 用户可以控制类或结构的数据字段的物理布局;LayoutKind控制当导出到非托管代码时对象的布局。 4. [MarshalAsAttribute(UnmanagedType.LPWStr)] 指示如何在托管代码和非托管代码之间封送数据;说明:UnmanagedType指定如何将参数或字段封送到非托管代码。 托管代码 (managed code)   由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。   托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware compiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。   在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。 非托管代码 (unmanaged code)   在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
最新技术文章:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)2012-,站长邮箱:www_169it_(请将#改为@)&&&&&&&&我要用C#调用C++的DLL(里面是关于DES加密的算法),但是调用是有时会报错提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
C#调用的代码:
&&&&&&&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&public&static&extern&string&desEncrypt2(string&keyText,&string&plainText);
char&*desEncrypt2(char&*encryptedText,&const&char&*plainText)
unsigned&char&buf[9];
char&hex[17];
unsigned&char&longbuf[512+1];
char&longhex[512*2+1];
memset(buf,&0,&sizeof(buf));
memset(hex,&0,&sizeof(hex));
memset(longbuf,&0,&sizeof(longbuf));
memset(longhex,&0,&sizeof(longhex));
strncpy((char&*)longbuf,&plainText,&sizeof(longbuf)-1); //平台移植到2008的需要,strncpy-&strncpy_s
for&(index&=&0;&longbuf[index];&index&+=&8)
memcpy(buf,&longbuf+index,&8);
DesEncrypt(key,&buf);
for&(int&i=0;&i&&&8;&i++)
sprintf(hex+2*i,&&%02x&,&buf[i]);
memcpy(longhex+2*index,&hex,&16);
strcpy(encryptedText,&longhex);
return&encryptedT
很可能是strcpy(encryptedText,&longhex);这句导致的,但是去掉直接返回longhex又是乱码。
我在网上找了很久,有说分配的内存空间没有释放,请问“unsigned&char&longbuf[512+1];char&longhex[512*2+1];”,这两个要释放的吗?不是动态分配啊,我不大懂C++麻烦各位帮忙了。
另外,我用的是VS2010的平台
回复讨论(解决方案)
for&(index&=&0;&longbuf[index];&index&+=&8)
memcpy(buf,&longbuf+index,&8);
DesEncrypt(key,&buf);
for&(int&i=0;&i&&&8;&i++)
sprintf(hex+2*i,&&%02x&,&buf[i]);
memcpy(longhex+2*index,&hex,&16);
for循环退出条件longbuf[index]有点问题
index可以取0,8,16,。。。,512
但是取到512时候还没推出循环,这边再改下估计就没问题了
直接把它限制在index限制在512就可以了吗?
另外忘了说了,我直接用C++调用这个函数desEncrypt2是没问题的,C#用dll才有问题。&
会不会是函数调用协议不一致啊
什么函数调用协议不一致啊?
大哥,具体点啊,我菜鸟来的
for&(index&=&0;&longbuf[index];&index&+=&8)
memcpy(buf,&longbuf+index,&8);
DesEncrypt(key,&buf);
for&(int&i=0;&i&&&8;&i++)
sprintf(hex+2*i,&&%02x&,&buf[i]);
memcpy(longhex+2*index,&hex,&16);
for循环退出条件longbuf[index]有点问题
index可以取0,8,16,。。。,512
但是取到512时候还没推出循环,这边再改下估计就没问题了
我试了一下不是这个原因。
各位大侠赶紧出来救命啊
参数类型不对??
大概是哪里的参数类型不对啊?
我这段时间还试过把返回的string&换成StringBuilder还是有问题
C#调用的代码:
&&&&&&&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&public&static&extern&StringBuilder&desEncrypt2(string&keyText,&string&plainText);
返回值必须是IntPtr类型,然后用下面代码取值
Marshal.PtrToStringAnsi(desEncrypt2(&xxx&,&xxx&));
返回值必须是IntPtr类型,然后用下面代码取值
Marshal.PtrToStringAnsi(desEncrypt2(&xxx&,&xxx&));
IntPtr类型算是整形吧,我在C++里面要返回的是一个字串类型是char&*&的,需要用怎么转换吗?
IntPtr类型算是整形吧,我在C++里面要返回的是一个字串类型是char&*&的,需要用怎么转换吗?
你把intptr理解成指针就行了,转换就用我上面的方法呀
调用DLL部分:
&&&&&&&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&public&static&extern&StringBuilder&desEncrypt2(string&keyText,&string&plainText);
实际调用时:
Marshal.PtrToStringAnsi(LowDes.desEncrypt2(key,&pass));
但是报错:
错误 1 与“System.Runtime.InteropServices.Marshal.PtrToStringAnsi(System.IntPtr)”最匹配的重载方法具有一些无效参
错误 2 参数&1:&无法从“System.Text.StringBuilder”转换为“System.IntPtr”
CONST&CHAR*&对应的C#类型&是&StringBuilder&&用这个试试
IntPtr对应指针类型
19位的char&*&对应20位的char[]
[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&public&static&extern&string&desEncrypt2(IntPtr&keyText,&IntPtr&plainText);
IntPtr&&keyText&=&Marshal.AllocHGlobal(2000);
IntPtr&&plainText&=&Marshal.AllocHGlobal(2000);
IntPtr&result&=&Marshal.AllocHGlobal(2000);
用函数的时候就&&result&=&desEncrypt2(keyText,&plainText);
CONST&CHAR*&对应的C#类型&是&StringBuilder&&用这个试试
我刚才试了一下
DLL部分只是把函数改为&const&char&*desEncrypt2(char&*encryptedText,&const&char&*plainText);&&就是增加了const&
调用DLL部分还是原来那样:
&&&&&&&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&public&static&extern&StringBuilder&desEncrypt2(string&keyText,&string&plainText);
但是还是提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”&
&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&&public&static&extern&string&desEncrypt2(string&keyText,&StringBuider&plainText);&-要这样
返回值是string&&如果是参数的就要用StringBuider
[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&public&static&extern&string&desEncrypt2(IntPtr&keyText,&IntPtr&plainText);
IntPtr&&keyText&=&Marshal.AllocHGlobal(2000);
IntPtr&&plainText&=&Marshal.AllocHGlobal(2000);
IntPtr&result&=&Marshal.AllocHGlobal(2000);
用函数的时候就&&result&=&desEncrypt2(keyText,&plainText);
这种方法是有效的,但是会引起一个新的问题&vshost32.exe已停止工作&。
&&问题事件名称: APPCRASH
&&应用程序名: TelSystem.vshost.exe
&&应用程序版本: 10.0.30319.1
&&应用程序时间戳: 4ba2084b
&&故障模块名称: ntdll.dll
&&故障模块版本: 6.1.
&&故障模块时间戳: 521ea8e7
&&异常代码: c0000005
&&异常偏移: 0002e41b
&&OS&版本: 6.1..0.256.1
&&区域设置&ID: 2052
&&其他信息&1: ba42
&&其他信息&2: ba2df025e6cf90b5164dd
&&其他信息&3: fd90
&&其他信息&4: fd90b03f4a21daf05185
我用下面这个函数给IntPtr&赋值的,我估计是这里面出了问题。
&&&&&&&&private&static&IntPtr&mallocIntptr(&string&strData&)&&
&&&&&&&&{&&
&&&&&&&&&&&&//先将字符串转化成字节方式&&
&&&&&&&&&&&&Byte[]&btData&=&System.Text.Encoding.Default.GetBytes(strData);&&
&&&&&&&&&&&&//申请非拖管空间&&
&&&&&&&&&&&&IntPtr&m_ptr&=&Marshal.AllocHGlobal(btData.Length);&&
&&&&&&&&&&&&//给非拖管空间清0&&
&&&&&&&&&&&&Byte[]&btZero&=&new&Byte[btData&.Length+&1];&//一定要加1,否则后面是乱码,原因未找到&&
&&&&&&&&&&&&Marshal.Copy(btZero,&0,&m_ptr,&btZero.Length);&&
&&&&&&&&&&&&//给指针指向的空间赋值&&
&&&&&&&&&&&&Marshal.Copy(btData,&0,&m_ptr,&btData.Length);&&
&&&&&&&&&&&&return&m_&&
&&&&&&&&}&&
&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&&public&static&extern&string&desEncrypt2(string&keyText,&StringBuider&plainText);&-要这样
返回值是string&&如果是参数的就要用StringBuider
这个方法也是可以的,我记得我看过一篇帖子是说返回值用StringBuider,参数用string&,我就那样改了,但是第一运行可以后面只有重新编译才不会报内存错误。看来是我之前理解错了,谢谢了。
&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&&public&static&extern&string&desEncrypt2(string&keyText,&StringBuider&plainText);&-要这样
返回值是string&&如果是参数的就要用StringBuider
这个方法也是可以的,我记得我看过一篇帖子是说返回值用StringBuider,参数用string&,我就那样改了,但是第一运行可以后面只有重新编译才不会报内存错误。看来是我之前理解错了,谢谢了。
你理解错了。如果是返回值一般是string&如果是&参数是为指针并且在方法内部有改动这个指针指向的值,那是要用StringBuider&如果没有用string也可以&
调用DLL部分:
&&&&&&&&[DllImport(&TestDll.dll&,&CallingConvention&=&CallingConvention.Cdecl,&CharSet&=&CharSet.Ansi)]
&&&&&&&&public&static&extern&StringBuilder&desEncrypt2(string&keyText,&string&plainText);
实际调用时:
Marshal.PtrToStringAnsi(LowDes.desEncrypt2(key,&pass));
但是报错:
错误 1 与“System.Runtime.InteropServices.Marshal.PtrToStringAnsi(System.IntPtr)”最匹配的重载方法具有一些无效参
错误 2 参数&1:&无法从“System.Text.StringBuilder”转换为“System.IntPtr”
你得把你的函数声明中的返回值改为IntPtr呀
输入不变char*类型用string,可变的用stringbuilder,返回char*一律用IntPtr,或者你直接用byte*接收返回值,毕竟你返回的是加密串,有一点楼主别忘了,C#是支持指针的,用指针方便得多
这个提示貌似是指针的问题...貌似有个函数可以把string转成IntPtr&&然后传到c++&&然后把c++把字符串传出来&&成为IntPtr再c#转成string
谢谢,各位大神了,按上面说的两种意见改好之后,用了两天都没问题应该是OK.。
总结一下可行的方案,给以后遇到这问题的兄弟:
1.用IntPtr指针接收返回值和传送参数的方式;
2.17楼大神的:返回值是string&&如果是参数的就要用StringBuider。C++和C#相互调用dll
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
C++和C#相互调用dll
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口◇本站云标签

我要回帖

更多关于 易语言调用dll 的文章

 

随机推荐