科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VB VC混合编程疑难问题解

VB VC混合编程疑难问题解

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍了VB6.0在与VC 6.0混合编程时几个常见难题的解决方法。

作者:务实 来源:天极网 2007年10月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
二、使用在VC++中动态申请的内存

  混合语言编程时,有时需要在VB代码中使用通过VC++动态申请到的内存。这时,可以通过下述方法实现:

  1) VC++中申请动态内存的DLL库函数

char* APIENTRY CreateStringBuffer(long Length)
{
char* bufV;//假设需要申请用以存放字符申的动态内存
buf=(char*)::malloc(Length);
return buf;//返回字符串指针,其实就是一个long型数
}

  2) VB中接收动态内存指针的代码

......
Declare Function CreateStringBuffer Lib "C:\DLLTest\Test.dll" _
(By Val Length As Long) As Long
'Long型变t接收动态内存指针
......
Dim slBuffer&
atBuffer = CreateStringBuffer (20)
'申请一块可存放20个字符的内存,得到指向该内存的指针
......
'使用该动态内存
......

  注意:VB中使用完动态内存后,为了避免内存泄漏二要将其指针传回VC++进行内存释放工作。

  三、自定义类型参数向ActiveX控件的传递

  在编写VB程序时,如果使用的是标准ActiveX控件,那么一般不需要向控件传递自定义类型的参数,因为大多数控件的大多数属性都是标准类型(如Double,Long)的。但是,在混合语言编程中,当我们采用VC++中的ATL3.0模板(而不是VB)自行开发ActiveX控件时,往往希望能够向控件的某些属性或方法传递自定 义类型的参数,以提高参数的传递效率。

  这里介绍一种向控件传递自定义类型参数的简便方法。假设要以VB为客户端开发一个ActiveX控件AX,它有一个Student属性,类型是自定义结构Person:

Type Person
 Age As Long
 Height As Double
End Type

  第一,正确编写Student属性的接口函数(以用ATL3.0 模板开发AX为例)。我们将Student属性存取函数的接口参数类型写成一个long型的指针,而不再是BSTR。因为ActiveX内部的通信全部基于Unicode基础之上,所以,这样处理会避免由于字符集不匹配而造成的参数误传。相关的代码如下:

  1) AX.idl中对Student属性的定义

[propget,id(0),helpstring("property Student")] HRESULT
Student([out,retval] long* pVal);
[propput,id(0),helpstring("property Student")] HRESULT
Student([in] long newVal);

  2) AX.h中对Student属性存取函数的定义

STDMETHOD(get_Student)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_Student)(/*[in]*/ long newVal);

  3) AXcpp中对Student属性存取函数的实现

STDMETHODIMP CAX::get_Student(long *pVal)
{
// TODD: Add your implementation code here
//得到存储Student属性的成员变t的指针,赋给*pVal
return S_OK;
}
STDMETHODIMP CAX::put_Student (long newVal)
{
// TODD: Add your implementation code here
//将存储Student属性的成员变址的指针指向newVal所指的内存空间,
//然后通过内存拷贝方式拷贝此空间存放的Student的属性值
return S_OK;
}

  第二,正确编写VB向AX的Student属性动态赋值的代码。在VB中,先声明一个Person型变量,给该变量赋值后,获取该变量的内存地址并赋给Student属性即可。代码如下:

......
Dim StudentProp As Person
Dim StudentAddr As Long
StudentProp.Age=23
StudentProp.Heigth=1.78
'得到StudentProp变量的内存地址(方法从略),赋给StudentAddr
AX1.Student= StudentAddr
......

  借助指针完成自定义类型参数向ActiveX控件的传递所依据的是以下事实:不论控件是.dll还是.ocx,它都是与其客户同在一个进程内的服务器。所以,只要AX被编译成.dll或.ocx,指针的传递就是安全可靠的。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章