求助C#调用C++DLL返回string

大王叫我来巡山了 2010-09-28 11:34:41

// mySum.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

extern "C" _declspec(dllexport) char *mySum(char *a, char **b)
{
printf((*b),"%s",a);

return *b;
}




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace TestDLL
{
public partial class Form1 : Form
{
[DllImport("MySum.dll", EntryPoint = "mySum", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern string mySum(string a, ref string b);
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
string b = "";
mySum("1234", ref b);
}
}
}



运行的时候,此行 mySum("1234",ref b); 报如下错误:
对 PInvoke 函数“TestDLL!TestDLL.Form1::mySum”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

...全文
397 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huifighting 2011-12-14
  • 打赏
  • 举报
回复
c#调用c++的带有xml文件的dll为什么会出错?比如
#include "stdafx.h"
#include <iostream>

using namespace std;

extern "C" _declspec(dllexport) char *mySum(char *a, char **b)
{
CvMat* Mb1 = (CvMat*)cvLoad( "Ma.xml");
return *b;
}
gomoku 2010-09-28
  • 打赏
  • 举报
回复
设计很不好的一个接口。
HolyPlace 2010-09-28
  • 打赏
  • 举报
回复
第二个参数不要使用ref使用IntPtr试试
  • 打赏
  • 举报
回复
如果勾选C#的设置,“允许不安全代码”,“启用非托管代码调试:
则同一行报:
托管调试助手“PInvokeStackImbalance”在“g:\documents\visual studio 2010\Projects\TestDLL\TestDLL\bin\Debug\TestDLL.exe”中检测到故障。
其他信息: 对 PInvoke 函数“TestDLL!TestDLL.Form1::mySum”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

各位兄弟Help!!!!
  • 打赏
  • 举报
回复
printf((*b),"%s",a); 这语句害人,没效果。
  • 打赏
  • 举报
回复
已经可以了。加C++ 加入_stdcall 把,“允许不安全代码”,“启用非托管代码调试“去掉这样才行。
谢谢,HolyPlace,founderfang。
founderfang 2010-09-28
  • 打赏
  • 举报
回复
出错信息讲得很清楚了。C的函数没有用stdcall为什么C#里要说它用了stdcall呢?
对 PInvoke 函数“TestDLL!TestDLL.Form1::mySum”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 holyplace 的回复:]
第二个参数不要使用ref使用IntPtr试试
[/Quote]
我是新手,烦请解答,
是不是这样呢? mySum("1234",(IntPtr)0);如果这样报:

尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

谢谢。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧