C#调用C++时,字符串返回参数出现的访问异常错误

C++函数原型:

BOOL _stdcall PSStartup(HANDLE hPrintps, LPCSTR lpszDatabasePath, LPCSTR lpszSpoolFile);

lpszSpoolFile为返回参数,由PSStartup中赋值并带回来。

一开始我在C#中的声明是:

[DllImport("PrintScu.dll", CallingConvention = CallingConvention.StdCall)]
public extern static int PSStartup(IntPtr hPrintps, string lpszDatabasePath, ref string lpszSpoolFile);

但是在实际调用的时候出现错误:

System.AccessViolationException was unhandled
  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Source=mscorlib
  StackTrace:
       at System.String..ctor(SByte* value)
       at System.StubHelpers.CSTRMarshaler.ConvertToManaged(IntPtr cstr)

网上找了一圈之后发现这样声明不行,不能使用ref string,而需要使用StringBuilder,于是改成以下声明,测试通过:

[DllImport("PrintScu.dll", CallingConvention = CallingConvention.StdCall)]
public extern static int PSStartup(IntPtr hPrintps, string lpszDatabasePath, StringBuilder lpszSpoolFile);

stackoverflow帖子地址

时间: 2024-10-18 06:07:46

C#调用C++时,字符串返回参数出现的访问异常错误的相关文章

254 在js调用函数时,传递变量参数时, 是值传递还是引用传递

问题: 在js调用函数时,传递变量参数时, 是值传递还是引用传递 理解1: 都是值(基本/地址值)传递 理解2: 可能是值传递, 也可能是引用传递(地址值) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>02_关于数据传递问题</title> </head> <body> <

Cpp 调用sql server 存储过程时不返回output参数解决办法

Cpp 调用sql server 存储过程时不返回output参数,但是在ssms中调用的时候能正常返回,貌似数据库和应用代码是一切正常,再测试用c#调用也能正常获取output参数,在存储过程的的开始加上set nocount on,就能解决这个问题. 墙外原文件:点击打开链接

PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)

php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误 错误:Cannot use object of type stdClass as array 产生原因: +展开 -PHP $res = json_decode($res); $res['key']; //把 json_decode() 后的对象当作数组使用. 解决方法(2种):1.使用 json_decode($d, true).就是使json_decode 的第二个变量设置为 tru

JS中函数的本质,定义、调用,以及函数的参数和返回值

要用面向对象的方式去编程,而不要用面向过程的方式去编程 对象是各种类型的数据的集合,可以是数字.字符串.数组.函数.对象…… 对象中的内容以键值对方式进行存储 对象要赋值给一个变量 var cat={ "name":"喵1", "age":4, "family":["喵爸","喵妈"], "speak":function(){ console.log("喵喵

动态调用WebService时动态获取返回Class中的属性

直接给代码: var ret = HTTPS.WSHelper.InvokeWebService("WebService URL", "MethodName", object[] args);var type = ret.GetType();var propertyinfo = type.GetProperty("result");if (propertyinfo == null){       throw new Exception("

Java加载jar文件并调用jar文件当中有参数和返回值的方法

在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成hello.jar文件. 1 package org.lele.fatpanda; 2 3 public class Util 4 { 5 public static String myName; 6 /* 7 * 无参数,无返回值的方法. 8 */ 9 public static void get

调用动态库时声明的参数个数不一致导致的问题

问题: 原因:调用动态库时声明的参数个数不一致.  本文用菊子曰发布

hibernate 调用存储过程返回参数

Connection conn= getSession().connection(); CallableStatement cs=null; //指定调用的存储过程  cs = conn.prepareCall("{Call PRO_PROCESSING_COMMON.GET_STR(?,?)}");  //设置参数  cs.setString(1, "TESTSTR");  //这里需要配置OUT的参数新型  cs.registerOutParameter(2,

PLS-00306: 调用 &#39;SYNCRN&#39; 时参数个数或类型错误

System.Data.OracleClient.OracleException (0x80131938): ORA-00604: 递归 SQL 级别 1 出现错误 ORA-06550: 第 1 行, 第 7 列: PLS-00306: 调用 'SYNCRN' 时参数个数或类型错误 ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored 在 System.Data.OracleClient.OracleConnection.CheckError 解决