C做的 dll 被 VB 程序调用

lsd 2000-07-22 08:47:00
加精
如下程序:
int test(char s[121], double x[7])
{
sprintf(s,"hello, the world!");
for(register i=0;i<7;i++)
x[i]=0.1*i;
return 0;
}

需要作成动态炼接库为 VB 程序调用。

我作了好多次,都不成功。实际上,对于如下程序
int _stdcall test(double x[2])
{
*x=1.1;
*(x+1)=2.2;
return 0;
}

作成 dll 被 VB调用, 该函数执行完后,对数组作操作,
总说下标越界。
在 VB中这样调用:(假设dll 为 test.dll)
private declare function test lib"test" (ByRef x() As double) As integer

sub try
dim r as integer
dim x(2) as double
x(0)=5.5
x(1)=5.5
debug.print x(0), x(1)
r=test(x())
debug.print x(0),x(1)
end sub

在执行第二个debug.print语句时出现所说的错误。

若test定义换成;
int _stdcall test(double *x,double *y)
{
*x=1.1;
*y=2.2;
return 0;
}

vb中如下用:
private declare function test lib"test" (ByRef x As double, ByRef y As double ) As integer

sub try
dim r as integer
dim x(2) as double
x(0)=5.5
x(1)=5.5
debug.print x(0), x(1)
r=test(x(0),x(1))
debug.print x(0),x(1)
end sub


则程序没有任何错误!

请各位高手多多指教!
...全文
203 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Un1 2000-07-24
  • 打赏
  • 举报
回复
把vb的声明改为:
private declare function test lib"test" (pa As double) As integer

调用时使用:
r=test(x(0))

就可以了,原因是如果用byref x() as byte,哪vc中接收的是一个safearray指针而不是x(0)的指针。


ta 2000-07-22
  • 打赏
  • 举报
回复
dim x(n) as double //

private declare function test lib"test" (ByRef x(0) As double, ByRef y As double ) As integer
有两点要注意: VB double 和 VC double 是否一样, 清查看一下, 变量对换表.
传递数组的方法, 传递第一个元素的地址.
hyzx2000 2000-07-22
  • 打赏
  • 举报
回复
将ByRef改成ByVal试试看。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧