当前位置:编程学习 > VB >>

请问这样的VB与c++结合的程序如何实现?

我想做这么一个程序,在VB的某些text里面输入一些数值,点击command之后调用一个C++程序,把text里边的数值传到c++程序里,计算之后c++程序再把结果传回到VB的某一个text中。
举个简单的例子,VB中有三个text:text1,text2,text3和一个command,在text1和text2中分别输入一个数,讲数传到c++中,计算他们的和,然后传回来在text3里边输出。我知道这个简单的程序完全可以只用VB,我只是想通过这个例子来学一下怎么将VB和c++联系起来。
我的VB和c++水平都非常低,都属于略知皮毛的程度,希望有大牛可以帮忙解答这个问题,可以的话baidu hi联系,谢谢了!  --------------------编程问答-------------------- 用C++做一个dll,然用VB调用它的功能 --------------------编程问答-------------------- 请问能不能帮忙按着上边的例子写一个……我很菜很菜DLL没写过 --------------------编程问答-------------------- 通常这种跨语言的配合使用有3种比较常用的方式,
1、用VC编写 API 形式的 DLL 给 VB 调用
2、用VC编写 COM 组件的方式给 VB 调用
3、用VC编写 ActiveX 控件的方式给 VB 调用
而第一种方式是VB与VC结合使用最普篇的方法。
详细步骤如下:
首先打开VC的开发环境,
在File菜单中选择 New 项创建工程
选择 Win32 Dynamic-Link Library 的项目,然后在工程名中输入好
你的项目名称,同时注意好你要选择的保存路径。
然后确定,然后选择 A simple DLL project. 项目然后继续下一步到
创建完成。
这时候在左边的栏目中通常是类视图模式(ClassView),然后点击下面
的FileView选择卡按钮就会看到你所建立的工程项所包含的文件。
因为选择的是A simple DLL project.项,所以VC会自动帮你生成相关
的几个文件,你打开你工程命名的文件,如APIDemo.cpp,里面系统也
帮你自动生成了相关的DLL入口函数,如:

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    return TRUE;
}

里面不需要什么处理,当然你也可以做一些初始化相关参数的操作。
然后就可以写你的函数了,如:

long Function1(long Var1,long Var2)
{
return Var1+Var2;
}

当你的函数写完后,需要添加一个特殊的.def文件,这个文件可以用
记事本来创建,文件名和主程序的名称一样,只是扩展名不是.cpp,
而是.def,如:APIDemo.def
然后在左边的FileView栏目的Source File项目中点鼠标右键,选择 
Add Files to Folder... 菜单项,然后将你建立的def文件选入到工
程中,然后双击你的.def文件,开始编辑
格式为
EXPORTS
你的函数名1
你的函数名2
你的函数名3
...
如:

EXPORTS
Function1

当操作完成后就可以保存并编译了.
编译后在工程文件夹的Debug目录中可以找到你的DLL文件,然后就是VB
调用的问题了
首先在VB中需要声明API函数,格式如下:
有返回的函数声明格式如下:
Declare Function 你的函数名 Lib "你的DLL文件名" (参数) As 返回类型

没返回的函数声明格式如下:
Declare Sub 你的函数名 Lib "你的DLL文件名" (参数)

在VB中,注意声明API函数的位置,如果在窗口或类中声明,函数必须以Private方式定义
如果在模块中,可以使用Public 或 Private 进行定义
就以一个简单的窗口中为例:

Private Declare Function Function1 Lib "APIDoem.dll" (ByVal Var1 As Long, ByVal Var2 As Long) As Long

Private Sub Command1_Click()
    '注意不要在TEXT中放文本哟,呵呵
    Text3.Text = Function1(CLng(Text1.Text), CLng(Text2.Text))
End Sub

然后就是把APIDoem.dll和VB编译的EXE放到同一个目录或把APIDoem.dll放到系统的System32目录中
就可以运行了 --------------------编程问答-------------------- 这样你竟然都会弄出问题来,真是“服了You” 啦
我在博客里做了一个图文的操作过程,你自己去看看吧,在出问题我也没办法了
http://blog.csdn.net/SupermanKing/archive/2010/03/05/5347763.aspx --------------------编程问答-------------------- 哦,我打字的时候有时候有点笔误,比如:APIDoem.dll,其实是 APIDemo.dll,
你不要直接 Copy 过去就用了,这样肯定会有问题的 --------------------编程问答-------------------- 如果是我
就用Shell调用VC编译的EXE文件并将数据用命令行的方法传给它
VC运行后将返回数据写到一个临时文件里,退出。
VB不断尝试独占打开该临时文件,成功后从里面读返回数据。最后删除该临时文件。 --------------------编程问答--------------------
引用 6 楼 zhao4zhong1 的回复:
如果是我
就用Shell调用VC编译的EXE文件并将数据用命令行的方法传给它
VC运行后将返回数据写到一个临时文件里,退出。
VB不断尝试独占打开该临时文件,成功后从里面读返回数据。最后删除该临时文件。

还好我没找你做程序,不然硬盘用不了多久就over了,呵呵,不要介意 --------------------编程问答-------------------- 严重建议楼主用com --------------------编程问答-------------------- vc写一个dll, 导出一些函数由vb调用, 老问题了。 就按3楼说的


刚巧昨天我正在弄一个vb调用vc的问题, 不过我希望在vb中使用c++类, 搞了一个测试程序。 
(以前没用过vb, 有地方说错勿怪):

//vc中的c++ class
class CTest1  
{
public:
CTest1();
virtual ~CTest1();

long CallByName(CString strFunc, VARIANT *pArgs); // 供外部调用的接口函数, 以函数名形式调用

protected:
long Show1();          // 测试函数1
long Show2(long i);    // 测试函数2

};


CTest1::CTest1()
{
AfxMessageBox(_T("Create CTest1"));
}

CTest1::~CTest1()
{
AfxMessageBox(_T("Delete CTest1"));
}

long CTest1::CallByName(CString strFunc, VARIANT *pArgs)
{
if (strFunc == _T("Show1"))
return Show1();
else if (strFunc == _T("Show2"))
{
VARIANT v = pArgs[0];
long i = v.lVal;
return Show2(i);
}

return 0;
}

long CTest1::Show1()
{
AfxMessageBox(_T("CTest1::Show1"));

return 0;
}

long CTest1::Show2(long i)
{
CString str;
str.Format(_T("CTest1::Show2, i = %d"), i);
AfxMessageBox(str);

return 0;
}

// vc dll中的导出函数, 供vb使用

#include "Test1.h"

// 用于构造c++对象
__declspec(dllexport) long __stdcall NewObj()
{
CTest1 *pObj = new CTest1;
return (long)pObj;
}

// 用于删除c++对象
__declspec(dllexport) long __stdcall DeleteObj(long *ptr)
{
CTest1 *pObj = (CTest1*)ptr;
delete pObj;
return 0;
}

// 用于调用c++对象的功能
__declspec(dllexport) long __stdcall XX_CallByName(long *ptr, char *pFunc, VARIANT *pArgs)
{
CTest1 *pObj = (CTest1*)ptr;
return pObj->CallByName(pFunc, pArgs);
}


'vb中的接口函数声明:
Option Explicit
Private Declare Function NewObj Lib "TestDll1" () As Long
Private Declare Function DeleteObj Lib "TestDll1" (ByVal p As Long) As Long
Private Declare Function XX_CallByName Lib "TestDll1" (ByVal p As Long, ByVal name As String, ByRef pArgs As Variant) As Long

'测试, 构建一个c++对象, 并调用其功能
Private Sub Command1_Click()
    Dim pObj As Long
    pObj = NewObj          ' 构造对象
    
    Dim args(1) As Variant
    args(0) = 150
    
    XX_CallByName pObj, "Show1", args(0)       
    XX_CallByName pObj, "Show2", args(0)
    
    DeleteObj pObj         ' 析构对象 
End Sub
--------------------编程问答-------------------- 使用ATL编写一个简单的COM服务器
http://blog.csdn.net/sonic_andy/archive/2009/08/01/4399367.aspx --------------------编程问答-------------------- 要是计算量不大的话就不必这么麻烦了吧,直接VB计算不行么?
补充:VB ,  非技术类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,