将指针传递到DLL中的函数
本文关键字:函数 DLL 指针 | 更新日期: 2023-09-27 18:21:24
我遇到了一个严重的问题。我有C#代码,它加载一个用C编码的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"的未处理异常
附加信息:试图读取或写入受保护的内存。这通常表示其他内存已损坏。
有办法解决这个问题吗?
好吧,问题解决了,错误比我想象的要明显得多:_SendFunc(...)
的返回值不是int
,而是long
,这导致了上面的消息。
很抱歉提出这个问题,也感谢大家的帮助。