首页 新闻 搜索 专区 学院

VC6制作DLL问题

0
悬赏园豆:30 [已解决问题] 解决于 2011-07-05 20:37

 本人没用过VC,今天需要用VC6做个DLL来替代别人写的一个DLL,它里面有一个函数A,

A中有3个参数,使用C#调用的时候,可以这样写

[DllImport("ZZ.dll")]
static extern int A(int num1, out int num2, ref string str1);

我参照上面的写法,写的DLL里A是这样写的

.cpp文件:

ZZ_API int A(int num1,int &num2,string &str1)
{
//Code
}

.h文件:

ZZ_API int A(int,int &,string &);

编译是能通过的,但我用C#写的那个程序去调用却提示出错:

对 PInvoke 函数“Test!Test.Form1::A”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

哪位仁兄能指导一下?

新的开始的主页 新的开始 | 小虾三级 | 园豆:679
提问于:2011-07-03 00:05
< >
分享
最佳答案
0

签名不匹配啊

[DllImport("ZZ.dll")]
       
static extern int A(int num1, out int num2, ref string str1);

ZZ_API int A(int,int& ,string &);是不能匹配的,如果想返回多个值,建议封装一个类,返回这个类
收获园豆:30
Daywei | 小虾三级 |园豆:551 | 2011-07-04 10:02
终于有人回答了~~
我只是想知道如果C#里要使用“static extern int A(int num1, out int num2, ref string str1);”这样的函数,DLL里的函数应该怎么写呢?因为是要用这个来替换别人的
新的开始 | 园豆:679 (小虾三级) | 2011-07-04 12:20
C++ string 与C# string 存在着很大的差别 具体如何去解决这个问题还得摸索和探讨,建议查查c++string引用的相关知识。应该可以解决
Daywei | 园豆:551 (小虾三级) | 2011-07-04 16:50
哦, 那除了string类型的参数可能有问题,我DLL里的A函数还有什么地方不对的吗?主要是C#里用out和ref,我就拿不准C++里应该用什么了,特别是.h文件里的函数签名应该怎么写。有什么不对的地方请帮我改正一下!
新的开始 | 园豆:679 (小虾三级) | 2011-07-05 08:49
其他没什么问题,其实out跟ref差不多,只不过一个要在里面初始化,一个在外面初始化,int类型的引用是对的,我测试过能读取出来
Daywei | 园豆:551 (小虾三级) | 2011-07-05 09:09
终于搞定了,改成“ZZ_API int A(int,int &,LPSTR);”的形式就OK了!
新的开始 | 园豆:679 (小虾三级) | 2011-07-05 20:36
其他回答(1)
0

目前的P/Invoke对于STL 的string类型不支持,这个类型有些复杂,具体的你可以看看P/Invoke的文档

2012 | 园豆:21007 (高人七级) | 2011-07-05 08:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册