我遇到了严重的问题。我有C#代码加载用C编码的DLL,该DLL调用用C ++编码的DLL。一切都很好,直到我想将数组的指针从C级传递到C ++级。
C中的调用代码如下:
#include <windows.h>
#include <winbase.h>
#include <windef.h>
int sendDLL( int* , int );
typedef int (*SendFunc)(int*);
int sendDLL( int* msg , int msgLength )
{
int status = 0;
SendFunc _SendFunc;
HINSTANCE serialLibrary = LoadLibrary("sender.dll");
if (serialLibrary)
{
_SendFunc = (SendFunc)GetProcAddress(serialLibrary, "UssSend");
if (_SendFunc)
{
status = _SendFunc(msg);
}
FreeLibrary(serialLibrary);
}
return status;
}
现在真正的转折是传递指针是不够的:传递的消息将被覆盖在DLL中,我们需要再次读出它,直到_SendFunc(...)
返回。
如果我从Visual Studio(最高级别 - C#)启动程序,我会在调用status = _SendFunc=(msg);
时得到以下权限(这是肯定的,如果已注释掉,则不会发生错误。)
TestRS232.exe中出现未处理的“System.AccessViolationException”类型异常
附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
有一种方法可以解决这个问题吗?
答案 0 :(得分:0)
好的,问题解决了,错误更加明显我曾经想过:_SendFunc(...)
的返回值不是int
而是long
,这导致上面的信息。
对不起这个问题,也感谢大家的帮助。