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 传递的指针为什么首单元又是正确的呢?
展开
 我来答
空雪梦见
推荐于2016-03-23 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1165万
展开全部

__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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式