vs2010中c#通过DLLImport调用C++的函数出错:尝试读取或写入受保护的内存

C++的DLL源码肯定是无法得到的,否则我就自己改写成C#的了。

用VS的Dependency查看,可见一些函数:
public: unsigned int const &_thiscall CFormulaInfo::GetForbidCycle(void) const
public: void _thiscall CFormulaInfo::SetForbidCycle(char const*, unsigned int)

尝试用DLL里面的一个类的这些方法,代码如下:
namespace JzConsole
{
class FormulaInfo

{

[DLLImport("FormulaCal.dll", EntryPoint="?GetForbidCycle@CFormulaInfo@@QBEABIXZ")]

public static extern int GetForbidCycle();

[DLLImport("FormulaCal.dll", EntryPoint="?SetForbidCycle@CFormulaInfo@@QAEXI@Z", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)]

public static extern void SetForbidCycle(int fc);
}

class Program

{

static void Main(string[] args)

{
int i = FormulaInfo.GetForbidCycle();

Console.WriteLine("ForbidCycle: " + i);

i = 1;

FormulaInfo.SetForbidCycle(i);

Console.Read();

}

}

}

编译没有问题。
运行:GetForbidCycle()成功,并输出一个整数的结果值。SetForbidCycle(i)失败,程序中断,报:
System.AccessViolationException 类型的未经处理的异常出现在JzConsole.exe中。
其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

请问如何修改?在网上查找到一些建议,但都无效。
CallingConvention=CallingConvention.StdCall改为.Cdecl报同样的错误。
如果GetForbidCycle()调用成功,说明DLL已经正确找到。
写错了:函数声明:
public: void _thiscall CFormulaInfo::SetForbidCycle(unsigned int)。
看了C#与C++的变量类型对应表,int和UInt32都试了也不行,毕竟GetForbidCycle的返回值用了int也没事啊。

SetForbidCycle(char const*, unsigned int)
为什么你申明的时候却
SetForbidCycle(int fc);

对不起来啊追问

上面那个写错了,底下补充了一个正确的。

追答

不懂你干嘛一定要把char const* 丢了

追问

SetForbidCycle(char const*, unsigned int)这个声明是错误的,是打字打错了,手误。
SetForbidCycle(unsigned int)这个声明是正确的,所以才调用SetForbidCycle(int fc)。

请把问题的全文看清,谢谢。

追答

如果不介意的话,可以把dll的简要说明和dll发到我邮箱277099731@qq.com,我可以调试看看

追问

你好,已经发了,也写了我的应用目标。谢谢帮忙。

追答

经过测试,在决策系统主程序打开的情况下,才可以使用这个函数
不然就会报错

追问

我是安装了的,主程序由于没有用户名和密码,无法登录。
只是想看它里面的公式文件。
启动主程序,不登录,好像也不行啊。
有什么其它程序的经验吗?难道就没办法了?

追答

没有登录只是开起来,就成功了,当我成功运行以后,就算把程序关了或者卸载了,还是可以再次运行,这点很奇怪,我没有重启机子做测试.
我测试的时候是用的绝对地址[DllImport("D:\\XXX\\FormulaCal.dll",......

总之问题不在于你的代码,看你如何和他主程序配合了
我也没有破解方面的经验,换做我是你,在毫无头绪毫无资料的情况下,只根据dll里的函数列表想把你要的东西拿出来,几乎是不可能的......
高端一点的话,可以尝试主程序反汇编,当你调用公式的时候看他是怎么运作的,然后再想办法

温馨提示:内容为网友见解,仅供参考
无其他回答