收录日期:2020/12/05 23:19:27 时间:2016/07/06 09:02:54 标签:COM/DCOM/COM+
我用的是VS2005版本,编写了一个VB的程序,要在VC中调用其中的函数接口。问题是如何将VB的函数接口公开,在VC里需要用__declspec(dllexport)语句来显式的声明,那么在VB中如何声明?另一个问题是,如何在VC中将VB的dll文件载入,我用了#import语句,但是链接失败,因为dll文件不被编译器识别。
最好以COM方式的来调用VB的DLL.
是考虑用VC COM智能指针的方式来调用VB的DLL,可是在用#import语句时候出错,无法识别导入的DLL文件,而用REGSVR32命令注册DLL文件时候,又提示找不到DLL REG server的输入点,所以无法注册。
就用COM的方法来调用
如下面是在VC中调用XMLHTTP的范例

//这里是DLL入口
#import "C:\WINDOWS\system32\msxml.dll"
#import "C:\WINDOWS\system32\msxml2.dll"

using namespace MSXML2;
HRESULT ComInit();
#include "stdio.h"
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    ComInit();   //调用下面初始化COM的函数
    IXMLHTTPRequestPtr xmlrequest;        //定义变量
    xmlrequest.CreateInstance("Msxml2.XMLHTTP");    //这里有点像VB的CreateObject创建对象
    //这里就像VB中正常的使用XMLHTTP对象了
    xmlrequest->open(_bstr_t("GET"),_bstr_t("http://www.baidu.com/s/index.asp?wd=vc+Com&tn=site888_1_pg&cl=3&ie=utf-8"),_variant_t("false"));
    //xmlrequest->send(_bstr_t("wd=vc+Com&tn=site888_1_pg&cl=3&ie=utf-8"));
    xmlrequest->send();
    BSTR bstrbody;
    xmlrequest->get_responseText(&bstrbody);
    _bstr_t bstrtbody(bstrbody);
    MessageBox(0, (LPCTSTR)bstrtbody, "OK", MB_OK);
    return 0;
}
//这里是初始化COM
HRESULT ComInit()
{
    HRESULT hr = S_OK; 
    if FAILED(CoInitialize(NULL)) 
    {
        CoUninitialize();
        hr = E_UNEXPECTED;
    }
    return hr;
}

虽然我举的例子是VC调用XMLHTTP的,但是与调用你自己用VB写的COM组件差不多。
主要就是:
1、申明入口
2、初始化COM
3、定义变量
4、创建对象
5、使用对象
谢谢SupermanKing,那么在VB中需要怎样的声明,才能保证生成的DLL文件可以被VC import呢?我现在在这个问题上被卡住了
创建 ActiveX DLL 以类的形势开发就可以了
还有,VB编译DLL时也会有lib文件的
我举个例子。
先说说VB开发一个COM组件。
用VB新建一个ActiveX DLL 工程,
然后修改工程名称为 MyVB
再修改默认的类名为 DEMO
然后再向类中添加一个函数作为测试用,如:

Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
'取得当前系统登陆的用户名称
Public Function GetMyName() As String
    Dim UserName As String
    UserName = String(128, " ")
    GetUserName UserName, 128
    UserName = Trim(UserName)
    GetMyName = Left(UserName, Len(UserName) - 1)
End Function

然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
如果在VB里,可以这样调用:

    Dim MyObj As Object
    Set MyObj = CreateObject("MyVB.DEMO")
    MsgBox MyObj.GetMyName
    Set MyObj = Nothing

这时可以看出,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
而 VC 里调用可以这样做,如:

//下面是指定DLL的位置
#import "C:\我的程序\VC调用COM\MyVB\MyVB.dll"
using namespace MyVB; //这里是COM组件名称
HRESULT ComInit();
#include "stdio.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
ComInit();
_DEMOPtr MyObj; //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
MyObj.CreateInstance("MyVB.DEMO");

_bstr_t vRsinfo; //VB的String在VC里可以用_bstr_t类型,所以就用_bstr_t类型来接返回参数
vRsinfo = MyObj->GetMyName(); //这里使用对象方法取得当前用户名称

MessageBox(0, vRsinfo, "OK", MB_OK);
return 0;
}

HRESULT ComInit()
{
HRESULT hr = S_OK; 
if FAILED(CoInitialize(NULL)) 
{
CoUninitialize();
hr = E_UNEXPECTED;
}
return hr;
}

以上 VC6 代码是建立一个 Win32 应用程序(Win32 Application),
选择 An empty project,然后再添加并添加一个 C++ Source File,
在 Windows XP 下测试通过。
學習力啊  接分了
引用 8 楼 yu3350360 的回复:
學習力啊  接分了



学习了
vb.Net中编译的dll并不是标准dll,更不是COM。我习惯叫他程序集。
如果要让vc能够调用vb.net编译的dll,那就显示的把dll编译成COM。

具体方法请参考:
http://blog.csdn.net/mysticboy/archive/2007/09/30/1808212.aspx
更正一下吧,严格的来说.net的dll是COM,但不是我们常规意义上的ActiveX。
感谢各位,原先的程序已经用VB6重新实现后通过COM让VC调用了,越来越感觉微软实在是个流氓了

如何让gridview固定高度 sql如何查询某个字段是否包含特定的字集合? 求求您啊,帮帮我吧! 开帖讨论 -- 规则引擎 (up有分) 请问:vc连接mysql数据库? 打印机属性 delphi下如何根据鼠标在不同控件上设置不同的鼠标形状,大家帮忙看看!! 双线路聚合问题 急急急!!!!!!!!!!!!!! 为什么这个程序可以编译但运行是就会出错呢?请指点,谢谢! 用什么方法获得jsp解析的base64编码 【刀刀英雄救镁了】大家快来看啊~~~~~~~~ 如何得到从叶子结点上朔到根结点之间的所有结点? 关于windows身份验证和操作Active Directory得到所有的域用户 rs.eof and rs.bof 错误问题 谁有MyEclipse下建一个Hibernate的实例的例子 没钱买书 想入个门 请高手帮翻译一下以下语句 郁闷的问题 关于水平考试的几个问题,希望有明白的给与答案 在这里推广一下自己的技术博客[来者有分] 去除数据库中空格的问题 同步powerdesigner的PDM到数据库的问题 急急急!!!!!!!!!!!!!! 急急急,关于将excel导入数据库的错误问题,请高手指点,先谢了。。 网页当中textbox的keypress方法的问题,得解后马上结贴! 用CListCtrl建立一个表格,怎样给表格加上边框? c#下16进制怎么表示啊?如何把16进制的数与string连接成一个新的string?谢谢! 我做的网站,大家给我一些技术方面的建议和意见。顺便问一下,我这样的情况,在北京能找到月工资多少的工作? NickLeeFramwork2005 框架演示进度 急救:局域网机器出现获取169.254.xxx.xxx的问题