vb 调用 c++ dll 函数问题
我的系统是win8.1(64位)+vs2013,vb选择使用.net2.0使用vc写一个dll,输出2个简单函数:void__stdcallCopyIntArray(in...
我的系统是 win8.1(64 位) + vs2013,vb 选择使用 .net2.0
使用vc写一个dll,输出 2 个简单函数:
void __stdcall CopyIntArray(int *pIn, int *pOut, int n)
{
//memcpy(pOut, pIn, sizeof(int) * n);
//便于测试
int i;
for (i = 0; i < n; i++)
{
pOut[i] = pIn[i];
}
}
void __stdcall CopyIntArray2(int **ppIn, int **ppOut, int n)
{
//memcpy(*ppOut, *ppIn, sizeof(int) * n);
//便于测试
int i;
for (i = 0; i < n; i++)
{
*ppOut[i] = *ppIn[i];
}
}
vb 使用这两个函数:
Private Declare Sub CopyIntArray Lib "testdll.dll" (ByVal pIn() As Integer, ByVal pOut() As Integer, ByVal n As Integer)
'调用的 c++ 函数工作得很好
Private Declare Sub CopyIntArrayX Lib "testdll.dll" Alias "CopyIntArray" (ByRef pIn As Integer, ByRef pOut As Integer, ByVal n As Integer)
'调用的 c++ 函数工作得很好
Private Declare Sub CopyIntArray2 Lib "testdll.dll" (ByRef pIn() As Integer, ByRef pOut() As Integer, ByVal n As Integer)
问题 1:
经测试,调用 CopyIntArray2,在 c++ 函数:
void __stdcall CopyIntArray2(int **ppIn, int **ppOut, int n)
中设置断点,发现 *ppIn[0] 数值正确,其他的 *ppIn[i] 乱码,想必 *ppOut 的情况一样,运行时发生错误就证明了这一点。CopyIntArray、CopyIntArrayX 工作的很好,说明vb向dll传递的指针是正确的。而CopyIntArray 传递的指针为什么会是错误的呢?CopyIntArray 传递的指针为什么首单元又是真确的呢?
问题2(这个问题困惑了我很久,当 vs6 时髦时我就有此疑问):
__declspec(dllexport) 修饰的函数导出后vb无法使用,而在def文件中定义导出的函数就可以。经检查发现__declspec(dllexport)输出的函数名多出一些符号,微软为什么不实现__declspec(dllexport)导出的函数名与程序中(如def文件中定义导出的函数)一致呢?
打错几个字,这里纠正:
而CopyIntArray2 传递的指针为什么会是错误的呢?CopyIntArray2 传递的指针为什么首单元又是正确的呢? 展开
使用vc写一个dll,输出 2 个简单函数:
void __stdcall CopyIntArray(int *pIn, int *pOut, int n)
{
//memcpy(pOut, pIn, sizeof(int) * n);
//便于测试
int i;
for (i = 0; i < n; i++)
{
pOut[i] = pIn[i];
}
}
void __stdcall CopyIntArray2(int **ppIn, int **ppOut, int n)
{
//memcpy(*ppOut, *ppIn, sizeof(int) * n);
//便于测试
int i;
for (i = 0; i < n; i++)
{
*ppOut[i] = *ppIn[i];
}
}
vb 使用这两个函数:
Private Declare Sub CopyIntArray Lib "testdll.dll" (ByVal pIn() As Integer, ByVal pOut() As Integer, ByVal n As Integer)
'调用的 c++ 函数工作得很好
Private Declare Sub CopyIntArrayX Lib "testdll.dll" Alias "CopyIntArray" (ByRef pIn As Integer, ByRef pOut As Integer, ByVal n As Integer)
'调用的 c++ 函数工作得很好
Private Declare Sub CopyIntArray2 Lib "testdll.dll" (ByRef pIn() As Integer, ByRef pOut() As Integer, ByVal n As Integer)
问题 1:
经测试,调用 CopyIntArray2,在 c++ 函数:
void __stdcall CopyIntArray2(int **ppIn, int **ppOut, int n)
中设置断点,发现 *ppIn[0] 数值正确,其他的 *ppIn[i] 乱码,想必 *ppOut 的情况一样,运行时发生错误就证明了这一点。CopyIntArray、CopyIntArrayX 工作的很好,说明vb向dll传递的指针是正确的。而CopyIntArray 传递的指针为什么会是错误的呢?CopyIntArray 传递的指针为什么首单元又是真确的呢?
问题2(这个问题困惑了我很久,当 vs6 时髦时我就有此疑问):
__declspec(dllexport) 修饰的函数导出后vb无法使用,而在def文件中定义导出的函数就可以。经检查发现__declspec(dllexport)输出的函数名多出一些符号,微软为什么不实现__declspec(dllexport)导出的函数名与程序中(如def文件中定义导出的函数)一致呢?
打错几个字,这里纠正:
而CopyIntArray2 传递的指针为什么会是错误的呢?CopyIntArray2 传递的指针为什么首单元又是正确的呢? 展开
1个回答
展开全部
__declspec(dllexport)导出的函数名就是内部链接用的函数名。用__cdecl就会换一种方式,后面没有@什么什么了
第二个问题,我试了一下,改为这样
void __stdcall CopyIntArray2(int **ppIn, int **ppOut, int n)
{
int i;
for (i = 0; i < n; i++)
{
(*ppOut)[i] = (*ppIn)[i];
}
}
至少读取是能读取了。毕竟要先解引用(解除ref)然后才能开始索引,而不是先索引然后再解引用。
但是如果声明的时候不说清楚数组长度,那么函数返回以后它就默认当作你长度是1了。所以指明最后一个参数为数组大小
Private Declare Sub CopyIntArray2 Lib "testdll.dll" (<MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=2)> ByRef pIn() As Integer, <MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=2)> ByRef pOut() As Integer, ByVal n As Integer)
.net 4.0下可以,.net 2.0下不认那个属性参数
想体会一下可以试试看我传的这份代码工程。两个工程都可以下断点然后启动实例调试
追问
谢谢,问题确实是出在 *ppOut[i] = *ppIn[i]; ,但是vb 访问ppOut又出现问题了。
这里的 int n 就是数组大小的,传入时数组均已经申请好内存了。
另外,zhidao_20141207.zip 文件下载不了。
追答
百度盘坑爹了?
刷新一下看看能不能下载。
再不行看看这个
http://pan.baidu.com/s/1bnESafX
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询