VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
先说说VB开发一个COM组件。
用VB新建一个ActiveX DLL 工程,
然后修改工程名称为 MyVB
再修改默认的类名为 DEMO
然后再向类中添加一个函数作为测试用,如:
| Visual Basic Code |
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里,可以这样调用:
| Visual Basic Code |
Dim MyObj As Object Set MyObj = CreateObject ( "MyVB.DEMO" ) MsgBox MyObj.GetMyName Set MyObj = Nothing
| |
这时可以看出,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
而 VC 里调用可以这样做,如:
| Visual C++ Code |
//下面是指定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 下测试通过。
发表于 @ 2008年10月16日 02:25:00|评论(loading...)|编辑|收藏