如何声明dll中的mxArray数据类型
请各位大虾帮一下忙,现在我用matlab写了一段程序,用VC生成了DLL文件,在VB中调用老是提示:“DLL调用约定错误”
matlab程序:function Untitled2(radius,area)
area=pi*radius^2;
VC程序:void mlfUntitled2(mxArray * radius, mxArray * area) {
mlfEnterNewContext(0, 2, radius, area);
Muntitled2(radius, area);
mlfRestorePreviousContext(0, 2, radius, area);
}这只是一部分;
VB程序:Private Declare Function mlfUntitled2 Lib "untitled.dll" (ByRef a As Double, ByRef b As Double)
Private Sub Command1_Click()
Dim i As Double, j As Double
Dim p
i = 2.5
p = mlfUntitled2(i, j)
Text1.Text = j
End Sub
请问是哪里的原因引起的呢?先在这里谢谢各位大虾了!!!
[解决办法]
显式声明vc dll 导出函数调用约定为:__stdcall
[解决办法]
能说的更详细些吗?我不是很明白!谢谢!
[解决办法]
void __stdcall mlfUntitled2(mxArray * radius, mxArray * area) {
mlfEnterNewContext(0, 2, radius, area);
Muntitled2(radius, area);
mlfRestorePreviousContext(0, 2, radius, area);
}
这样吗?
但是提示:e:\devise\vc\untitled\untitled2.c(26) : error C2373: 'mlfUntitled2' : redefinition; different type modifiers
e:\devise\vc\untitled\untitled2.h(28) : see declaration of 'mlfUntitled2'
untitled.c
执行 cl.exe 时出错.
[解决办法]
void 就是没有返回值,VB 中应该声明为 Sub 而不是 Function,你的函数声明需要返回一个 Vairant 值。
[解决办法]
double _stdcall mlfData(double *x)
{
int nargout = 1;
double *out;
mxArray *y;
mxArray *a;
a = mlfScalar((double)*x);
mlfEnterNewContext(0, 1, a);
y = Mdata(nargout, a);
mlfRestorePreviousContext(0, 1, a);
out = mxGetPr(y); //c获得结果的实部,即结果
mxDestroyArray(a); //释放空间
mxDestroyArray(y); //释放空间
//return mlfReturnValue(y);
return (*out);
}
现在我的*x是指向数组的指针变量,*out是返回计算后的指针变量(数组),请问怎么样才能返回数组了!
[解决办法]
不能直接返回一个数组,外部调用者没有足够的信息对该数组进行安全地释放。
参考 API 函数 GetWindowText,数组由调用者创建(也由调用者负责释放),函数只是往该数组中写数据。通过指示数组长度的参数,还可以避免产生缓冲区溢出的问题。