在Wincc中通过VBS调用VB语言编写的DLL

在Wincc中通过VBS调用VB语言编写的DLL
在Wincc中通过VBS调用VB语言编写的DLL

VBS作为一种脚本语言有其局限性,同VB等高级语言比起来,其底层开发能力尤为弱小。但是,VBS和VB是小弟与大哥的关系。小弟有事情摆平不了,当然要请求大哥帮助,大哥的能力与作用将在这时展现出来。动态数据链接库就提供了这样的一个机制,当有难题VBS解决不了的时候,我们可以通过把这个难题交给高级语言,然后在高级语言中生成动态链接库(DLL)来供其他语言调用。

这让我想到了上篇关于VBS编写读串口通讯的那篇文章,里面的某些函数和方法完全可以通过在VB脚本中来编写,然后生成DLL工Wincc调用。

下面来整理一下我的设计思路:

1.在VB中编写程序并声成DLL文件

首先,通过VB6.0新建一个ActiveX DLL项目,将工程名称改为“project”,类名改为“testdll”。

然后新建一个功能“output”,输入以下内容。保存项目。

在文件菜单下选择“生成project.dll文件”。保存路径为D:\Work space\VB_DLL

2.将DLL文件添加到注册列表

“开始”——“运行”——“cmd”切换到D:\Work space\VB_DLL,输入regsvr32 project.dll。

此时,会弹出下列对话框,说明注册成功。

3.编写Wincc侧的VBS程序,激活并测试

在Wincc中新建一个按钮并在单击事件中编写如下代码。激活Wincc项目。

单击“DLL测试”按钮,弹出对话框,说明调用成功。

vb调用vc 的DLL

4.1 新建工程 打开在VC++6.0,new一个Win32-Dynamic-Link Library工程dlltest。 4.2 在工程中添加代码 4.2.1添加lib.h文件: #ifndef _LIB_H_ #define _LIB_H_ extern “C” int __stdcall add(int,int) ; extern “C” int __stdcall sub(int,int) ; /* __stdcall 约定 如果通过VC++ 编写的DLL 欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall 方式, WINAPI 都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall 方式与__cdecl 对函数名 最终生成符号的方式不同 */ #endif 4.2.2添加lib.cpp文件: #include “lib.h” int __stdcall add(int a,int b) { return a+b ; } int __stdcall sub(int a,int b) { return a-b ; } 4.2.3添加lib.def文件: 右击SOURCE FILE目录,添加一个文本文件(不能是word文档,一般是txt 格式的),将文档重命名为lib.def,点击打开该文档。 在文档中输入代码: LILBRARY dlltest EXPORTS add @ 1 sub @ 2 说明:DLL函数的导出有两种方式。

一种是显式导出:在.h文件中在函数声明前加入如下语句: __declspec(dllexport)。使用该方法是不用添加.def文档的。该方法导出的函数,只能被C或C++调用,不能被其他语言调用。 一种是隐式导出:就是在SOURCE FILE目录中添加一个.def文档,在该文档中写入要导出函数的代码。 .def语法规定注释用分号(;),且注释不能与代码共享一行,代码说明如下:LIBRARY dlltest ;该语句说明了相应的DLL工程。 EXPORTS add @ 1 sub @ 2 ;该语句声明了将DLL工程中导出的函数,只要写入 ;函数名称即可,不用说明返回值以及函数参数。其实@ 1 ;和@ 2是为函数编号所使用的 在添加所有的工程文件后,编译生成dll文件后 4.3 用vc调用DLL 在vc中new一个Win32 Console Application 工程test 代码如下: #include #include typedef int (__stdcall *padd)(int,int) ; typedef int (__stdcall *psub)(int,int) ; int main() { HINSTANCE hd ; hd = LoadLibrary(“填入要调用DLL的路径”) ; if(!hd) { printf(“Load DLL err\n”) ; return 0 ; } padd add = (padd)GetProcAddress(hd,“add”) ; if(!add) { printf(“Get add err\n”) ; FreeLibrary(hd) ; return 0 ; }

wincc 常用脚本

DeactivateRTProject ();//退出系统 #pragma code("useadmin.dll") #include"PWRT_api.h" #pragma code() char* CUser=NULL; CUser=GetTagChar("@CurrentUser"); if (strlen(CUser)==0) { PWRTSilentLogin("operator","123456");//用户“operator",密码"123456”登录} OpenPicture("@MAIN.pdl"); } 在画面中结合不同按钮来组态下面 C 操作 Login Action for login (for example, "mouse click" event): #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogin('c'); Logout Action for logout (for example, "mouse click" event): #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogout(); PWRTLogin 参数必须是CHAR 字符。它指定了显示对话框的监视器。如果只使用一个监视器,那么保留默认参数“c”或者指定“1”。 注意 可以使用PASSLoginDialog 函数来代替PWRTLogin 或者PWRTLogout 函数。这个函数需要和函数PWRTLogin 相同的参数。PWRTLogin 和PASSLoginDialog 函数可以调用登录界面,在上面可以登录或者注销。函数PWRTLogout 被正确执行并且不调用登录界面。 正确执行后这两个函数都返回“1”。然而,登录不会等到显示对话框之后。 注意 如果使用多个显示器,为了能使登录对话框显示在合适的显示器上,需要WinCC Basic Process Control (OS项目编辑器)。 不使用WinCC Basic Process Control 时,可以指定显示器编号,但登录对话框始终显示在第一个显示器上。 #include"apdefap.h"//调用函数代码 void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

VB调用动态链接库(DLL)

VB调用动态链接库(DLL) 作为一种简单易用的Windows开发环境,Visual Basic 从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。但凡事有利必有弊。 VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows 交互的机会。因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用 C/C++等开发一些动态连接库,用于在VB中调用。本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。 Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出数据,但

实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。 一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。但也有例外,如16位Windows 的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。 作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题: 1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API

VB如何调用dll函数

VB如何调用dll函数 2008-01-10 17:17 開始習慣孤單 | 分类:VB| 浏览13089次 假如我有个DLL,名为 asdfg.dll 它里面有一个函数 zxc(参数1,参数2) 我要用这个函数,该怎么写? 请高手帮我写出脚本,有时间的话请再加上注释 谢谢!! 2008-01-10 19:50 提问者采纳 1.在工程-引用中将asdfg.dll引用过来 2.dim AAA as asdfg 'asdfg是类模块的名称 Private Sub Form_Load() dim x Set AAA = New asdfg x = AAA.zxc(参数1,参数2)'参数1,2自己写 End Sub 建议你了解一下下面dll的制作方法,理解就更透彻了。下面内容来自百度。 1.新建一个ActiveX Dll,工程名字为vbmytestdll,类模块

名字为mytestdll 2.类模块内容只有一个函数,主要返回DLL的HELLO WORLD Public Function dlltest1() As String dlltest1 = "HELLO WORLD" End Function 3.保存,生成DLL,名字为 vbmytestdll.dll 4.新建一个EXE工程,在菜单: 工程---引用---浏览里找到vbmytestdll.dll,把它引用进来 5.EXE工程代码如下: Option Explicit Dim testdll As mytestdll'类模块名字 Private Sub Form_Load() Set testdll = New mytestdll 'DLL的一个新实例 Me.Caption = testdll.dlltest1 '我的标题=返回DLL的HELLO WORLD

wincc功能使用总结

1、Wincc online trend控件实现多条曲线查询 项目要求,查询任意时段内的两条曲线的历史数据 1、首先在变量记录中设置需要记录的变量,如果需要在一个控件内显示两条曲线,做数据 归档时,归档属性最好是一致的,归档属性不一样是否会出现问题,这个没测试,有兴趣的可以测试一下。 2、数据记录设置OK后,新建画面插入online trend控件,我的项目需要把趋势打印出来, 所以把控件的工具栏全部隐藏。 3、双击online trend控件,添加需要显示的归档变量。选择公共X,Y轴等参数。坐标显示 根据自己使用选择,基本上不用设置太多参数。 4、添加需要显示的历史归档变量后,就需要写脚本了,西门子工控网论坛有实例,实例提 示针对于一条曲线时使用,咨询西门子技术支持,如果需要同时显示两条曲线时,需要对两条曲线分别进行设置属性“控件.index=0,1”,但是测试其实只设置index=0的起始及结束时间就OK,就是论坛给的实例不是只针对于一条曲线,两条曲线时同样适用,再多的曲线就没测试了。 5、西门子默认的时间格式为“MM-DD-YYYY HH-MM-SS”格式,所以在设置趋势起始及 结束时间时需要注意。 6、注:导入归档数据需要一定的时间,建议按钮触发。尝试在画面打开时触发脚本,有的 时候会出现历史数据加载不上来。 7、脚本如下,仅供参考 Dim objConnection Dim strConnectionString Dim strSQL Dim objrs Dim chaxun '定义曲线控件 Dim TREND Dim strval_1

Dim strval_2 Dim strval_t1 Dim strval_t2 '初始化程序,省略N行。。。。。。。。。。。。。。。。。。。。。。。。。。。。 '初始化程序,省略N行。。。。。。。。。。。。。。。。。。。。。。。。。。。。 chaxun=HMIRuntime.Tags("管号查询输入").Read strConnectionString = "Provider=MSDASQL;DSN=REPORT;UID=;PWD=;" strSQL = "select * from report where guanhao='"&chaxun&"';" Set objConnection = CreateObject("ADODB.Connection") objConnection.ConnectionString = strConnectionString objConnection.Open Set objrs = CreateObject("ADODB.RecordSet") objrs.open strSQL,objConnection /赋值程序,省略,,,,,,,,,,,,,,,,,,,,,,/ /赋值程序,省略,,,,,,,,,,,,,,,,,,,,,,/ objrs.close Set objrs = Nothing objConnection.Close Set objConnection = Nothing '趋势时间设定 Set trend = ScreenItems("控件1") strval_r=HMIRuntime.Tags("测试日期_read").Read strval_t1=HMIRuntime.Tags("开始时间_read").Read strval_t2=HMIRuntime.Tags("测试时间_read").Read

一步一步教用VC和VB调用C++ DLL

一步一步教你用VC和VB调用C++ DLL 从VC++应用程序调用C++ DLL的函数 Visual Studio 6 使创建包含函数或类的动态连接库(DLL) 变得非常容易.第一步 打开Visual Studio 然后选择File | New菜单项: 选择Win32 Dynamic Link Library, 输入工程名, 敲OK.

选择A DLL that exports some symbols 并单击Finish.在File View里你会看到如下的工程文件: 第二步 在Test.cpp里,你将看到如下代码: // Test.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "Test.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_ call, LPVOID lpReserved)

{ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // This is an example of an exported variable TEST_API int nTest=0; // This is an example of an exported function. TEST_API int fnTest(void) { return 42; } // This is the constructor of a class that has been exported.// see Test.h for the class definition CTest::CTest() { return; } Test.cpp 包含了fnTest 和 CTest::CTest.如果你现在编译Test.dll, 你将会得到一个可以被其他VC++应用程序直接调用的DLL. 允许其他VC++程序调用的关键机制?( key mechanism)就包含在Test.h中: // The following ifdef block is the standard way of creating macros// which make exporting from a DLL simpler. All files within this DLL// are compiled with the TEST_EXPORTS symbol defined on the command line.// This symbol should not be defined on any project that uses this DLL.// This way any other project whose source files include this file see // TEST_API

WINCC脚本个人经验总结

语音报警的组态 在工业现场安全是极其重要的,无论从那个角度讲我们应该利用一切手段减少故障的发生。在故障已经发生的时候,应该在第一时间以多种方式通知操作人员有故障发生。现代微处理计算机的处理速度可以完全胜任对于图形,语音地同时处理。所以我们可以利用计算机的声卡和音箱在有故障发生的时候产生语言报警,但是问题是WinCC本身并不能产生语音的功能,而且其内部的上千个函数也没有提供处理声音的函数。解决这个问题的方法归功于微软开发的WinCC与操作系统地完美结合,因为在WinCC中可以直接调用Windows的API函数。实现的具体C脚本代码如下: long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { #pragma code(\"Winmm.dll\") void WINAPI PlaySoundA(char *pszSound,char *hmode,DWORD dwflay); #pragma code() if(GetTagBit(\"112排泥备泵故障\")) PlaySoundA(\"d:\\\\\\\\winnt\\\\\\\\media\\\\\\\\Mircosoft sound.wav\",NULL,8); return 1020; }重新启动后,不使用登录窗口如何以一个缺省用户的身份自动登录?怎样确保运行期间有个缺省用户始终处于登入状态?即使另外一个用户已经预先退出。 解答: 重新启动以及在运行期间,您希望HMI系统达到最小的实用性而不使用登录窗口。然而,对于高级操作,登录功能应当保留。此外,如果没有用户登录,则有一个缺省的用户自动登录。缺省用户的权限可以在用户管理器中根据需要设定。 可使用下面的C脚本执行此项功能,请按照下列步骤进行: 将附件中的函数“Silentlogin.pas”复制到项目中的“PAS”子文件夹中。 在项目中选择Global Script > C Editor > Actions > Global Actions并打开全局动作(Global Action)“Silentlogin.pas”。 在“PWRTSilentLogin (“Login”,“Password”);”一行中,用缺省的用户名替换用户“Login”,用缺省用户的口令代替“Password”。 无限循环命令 static int a=0, b=0; if(GetTagBit("BINi_pictu_dyn_09")) { if(b==0) a++; else a--; if(a==7) b=1; if(a==0) b=0; }

vb编写DLL学习

怎样用VB编写DLL文件??? 你先打开VB,然后先中“ActiveX Dll”工程,然后开始编辑。编完后,保存一般是以“.cls”和“.vbw”保存。这时你选择“文件”菜单,弹出下拉框,选中“生成.dll”选项,它就会在上面弹出一个进度条“正在生成.dll文件”。生成以后是一个有好象齿轮状的图标。 如果你要引用,就开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到你刚才的“.dll”的文件名,在前面的复选框中打勾,就可以引用你刚才在那里面写的方法等。 在vb6里建新工程时选用建立dll 做好后用vb的引用就可以了 VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS 非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。 VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句: Sub Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If End Sub 然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。这样在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了。然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd: Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long mathadd = a + b End Function 编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是: Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS 注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要: Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long

WinCC脚本案例保留

WinCC脚本案例保留 2010-09-16 16:44 最近做一个WinCC跟ERP通讯的一个小项目,将脚本语言保留下来,以备不时之需! 仅仅是保留,各位看官如发现不妥之处请加以指教. 1.通过扫描枪扫描到ID号传给PLC,WinCC读取到ID号从ERP数据库中查找相关数据,写回到PLC,并给PLC一个写完成确认信号.(数据库是SqlServer2000) Dim DB240trigger,db241trigger db240trigger=HMIRuntime.Tags("db240itrigger").Read db241trigger=HMIRuntime.Tags("DB241itrigger").Read Dim ss,str str=HMIRuntime.Tags("DB240szcoil_ID").Read ss=CStr(str) If (db240trigger=1 And db241trigger=0 ) Then Dim sPro,sDsn,sSer,sCon,sSql Dim oRsMaterial,conn,oCom,oItem,oRsSCHEMA Dim database,server,uid,pwd sCon ="driver=sql server;server=10.51.103.96;DATABASE=brgs_release;uid=sa;pwd=pasword" Set conn = CreateObject("ADODB.Connection") conn.ConnectionString = sCon conn.Open Set oRsMaterial = CreateObject("ADODB.Recordset") sSql= "SELECT * FROM dbo.BRGS_GP_Material where MkNo='" & CStr(ss) & "'" oRsMaterial.open ssql,conn,1,1 Dim m,n m=oRsMaterial.recordcount If m<>1 Then MsgBox "这个ID号找不到唯一的一条参数信息,请手动输入信息!" Exit Function End If Dim sCon2,sSql2

在VB中调用DLL的方法

1制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。 语句格式为:Declare Sub过程名Lib[Alias"别名]([ByVal参数AS类型]),或为Declare Function函数名Lib[Alias"别名]([ByVal参数AS类型])AS类型在声明中首先用Declare 关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。 例如上面的ADD.DLL在VB中就可以声明为: Declare Function ADD Lib“c:\ADD.dll”(ByVal X AS Integer,ByVal Y AS Integer,ByVal filein asstring)AS Integer 通过此声明语句将函数ADD声明到VB中,便可直接调用。 2、dll文件中的函数好像是C语言写的, //函数名:int__stdcall GetMacNo(int*MacNo) //功能:获取卡机的卡机号(单机时) //参数:MacNo[0]-被读出的卡机号 //返回值:0-成功, //2-PC接收超时, //3-应答错误 dll的文件名是COMM232.dll 函数的形参int*MacNo是指针吗? 在VB中应该怎么声明和调用该函数? VB里也可以定义指针吗? 问题补充:vb调用dll文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事, 我是这样声明的对吗? Public Declare Function GetMacNo Lib"COMM232.dll"(ByVal MacNo As Integer)As Integer 又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo还是要怎么做? 都说了MacNo是被读出的卡机号,那么就是传址的了。 dim l as integer dim m as integer l=GetMacNo(m) if l=0then label1.caption="卡机号:"&m elseif l=2then msgbox"PC接收超时" elseif l=3then msgbox"应答错误" end if

VB操作wincc脚本心得

Vbs 操作wincc画面脚本总结 一:不使用变量单纯的操作界面 1.操作某个画面中控件的属性如Home1.Pdl(总窗体)下的画面窗口2(画面窗口) Sub OnClick(ByVal Item) Dim objCircle Dim screenname Dim pwname Set objCircle= ScreenItems("圆1" ) objCircle.Radius = 60 Set screenname=HMIRuntime.Screens("Home1") //获取要操作的窗体 Set pwname=screenname.ScreenItems("画面窗口2") //获取要操作的控件,这里填入你要操作的控件名 MsgBox(objCircle.Radius) //输出圆的半径 MsgBox (pwname.Picturename) //输出当前画面窗口2的名字 End Sub 注意当调用某窗体下的某控件的某个属性时,需要声明两个对象,一个接纳这个控件,一个接纳值例如 Dim object Dim value Set object =HMIRuntime.Screens("Home1").ScreenItems("画面窗口2") Set value=object.picturename 2.更改画面窗口的对象 Sub OnClick(Byval Item) Dim opObject Set opObject=HMIRuntime.Screens ("Home1").ScreenItems("画面窗口2") opObject.PictureName="Page1.Pdl" End Sub 3.设置文本 Set titleTxt=HMIRuntime.Screens ("Home1").ScreenItems("静态文本2") titleTxt.Text =titleTxt.Text+"EF" //获取文本的值并追加字符 4.vb 字符串函数 VB的字符串截取函数有Left(字符串,n),返回字符串前N个字符;Mid(字符串,p,n),从第p个字符开始,向后截取N个字符;right(字符串,n),返回字符串的最后n个字符。 获取下标

VB封装DLL实例讲解(三)

4 1 2点选DLL 3点打开按钮

5 2 3点选DLL 4点打开按钮

我们可以将注册语句放在窗体的加载事件,自动完成DLL的注册,具体可以参看实例。但如果我们有多个DLL需要批量注册时,可以考虑通过软件打包发布工具来完成DLL的注册工作;也可以事先编写BA T文件,让打包发布时将该BA T文件一并打包发布,安装时运行该BA T文件,来完成N个DLL的批量注册,在些就不多着笔墨,大家可以参看实例包中的BA T文件实例。 (二)DLL自动引用方法 2.1 通过References对象的AddFromFile方法实现自动引用 Dim ref As Reference '申明引用类对象 On Error Resume Next '避免因重复引用造成的错误提示 '实例化引用对象,完成DLL的引用 Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll") 为了避免因重复引用出现的错误,我们可以如上代码中加入Error语句,我们还可以在应用程序退出时,通过对References对象的Remove方法释放DLL或反引用。 Dim ref As Reference '申明引用类对象 '实例化反引用对象 Set ref = References("ClsFindString") '移除引用指定类库 References.Remove ref 说明:根据本人实践,我个人倾向于使用Error语句,因为如果应用程序非正常退出,引用对象没有反引用成功,启动时就难免出现重复引用的错误问题。 2.2 通过DLL唯一标识号实现自动引用 Dim ref As Reference'申明引用类对象 On Error Resume Next '避免因重复引用造成的错误提示 '唯一标识号完成注册,需要DLL标识号,主版本号,次版本 Set ref = References.AddFromGuid("{C5E340E2-C557-4852-AE83-5A0578B6863B}", 1, 0) DLL的标识号是编译生成时就确定了的,这个标识号就是DLL的终生制身份证号,我们可以通过这个唯一标识号来完成DLL自动引用。但此种方法必须具备两个条件,一是DLL已经成功注册,二是我们知道了该DLL的标识号、主版本号、次版本号。 2.2.1获取DLL标识号、主版本号、次版本号方法 Dim ref As Reference '申明引用类对象 '实例化引用类库对象 Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll") Debug.Print ref.GUID '获得DLL唯一标识号 Debug.Print ref.Major '获得主版本号 Debug.Print ref.Minor '获得次版本号

vb调用vc的dll

一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL;一种是VC 生成ActiveX控件(.ocx),在VB中插入;还有一种是在VC中生成ActiveX Automation服务器,在VB中调用。相对而言,第一种方法对VC编程者的要求最低,但要求你的伙伴进行配合,我推荐这种方法。 先说说VC++的编程。首先在VC++中生成Win32 DLL工程。在这个工程中添加几个函数供VB 用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如: short __stdcall sample(short nLen, short *buffer) 要做到第二条,需要在*.def文件中加上如下的几行: EXPORTS sample @1 这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。 再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。对于上面一个例子,先要声明VC函数: Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer 这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法: sample 10, a(0) 这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。 下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目

WinCC实例教程

WinCC 视频教程知识点总结 第一讲组态软件基础 一、WinCC简介 1、WinCC 西门子视窗控制中心SIMATIC WinCC(Windows Control Center)是在计算机上对PLC 控制的运行设备进行状态监控的软件,是PC上的监控软件。 运行该软件,可以动画监视现场设备的运行状况,监视相应的运行参数,以及更改、设置系统的运行数据。 2、WinCC的特点 (1)开放性 WinCC对用户所添加的任何形式的扩充是绝对开放,该绝对开放性是通过WinCC的模块结构及其强大的编程接口来获取的。 (2)将应用软件集成到WinCC中 WinCC提供了一些方法将其他应用程序和应用程序块统一地集成到用于过程控制的用户界面中。OLE应用程序窗口和OLE自定义控制或Active控制可以集成到WinCC应用软件中。 (3)WinCC中的数据管理 WinCC的数据库为Windows SQL,从属于WinCC,该数据库用于存储所有面向列表的组态数据(如变量列表和消息文本),以及当前过程数据(如消息,测量值和用户数据记录等)该数据库具有服务器功能。

(4)在项目开始之前规定组态分类 a、文件夹名称 除一些特殊字符(例如\)之外,文件夹名称允许使用所有的字符。还允许使用数字0~9. b、变量名称 变量名称可以多于8个字符。但应尽量避免太长的名称。WinCC项目的变量名称必须是唯一的。如果变量名称还包含了其他信息,这对用户将非常有用。 c、画面名称 确定画面名称时应注意其长度的影响,太长的名称(文件名)不容易识别(列表框中的选择,脚本中的调用等)。根据经验表明,长度最好不超过28个字符,画面名称应遵守以下限制条件:①最大长度为255个字符;②不使用某些特殊字符(例如\);③画面名称中的字母不区分大小写。 二、WinCC软件的安装 1、安装S7-300/400PLC编程软件STEP7及PLCSIM; 2、安装数据库软件SQL Server 2000; 3、安装消息列队(软件操作); 4、安装WinCC(建议不选典型安装,选择全部安装)。 三、WinCC管理器 1、WinCC项目管理器的结构 WinCC项目管理器的用户界面由以下元素组成:标题栏、菜单栏、工具栏、状态栏、浏览窗口和数据窗口:

(完整版)vc6.0编写DLL文件及vb调用示例

利用vc6.0编写DLL文件,为了方便其他函数调用,可以采取以下方式 方法过程 一采用Win32 Dynamic-Link Library建立。 过程:本次采用建立一个计算整数的平方和立方的plf.dll文件。 1文件—新建—工程—Win32 Dynamic-Link Library,工程名称为plf,点击确定,后选择一个空白文档。 2,点击做下角FileView。显示如图1所示 2.左上角文件—新建—文件—C++ Source File,输入名称为plf.,建立空白文档plf.cpp 在其内输入代码如图2所示: 3左上角文件—新建—文件—C++ Header File,输入名称为plf.,建立空白文档plf.h 在其内输入代码如图3所示: 4在plf文件夹中新件文本文档,里面输入如图4所示代码

保存,改后缀名为def.名称为plf.def。 5 右击Source Files,选中添加文件到目录,对话框选中plf.def文件。6点击组建(plf.dll)或者直接键盘F7。 7打开DEBUG文件夹中有两个文件为plf.dll和plf.lib文件,保留。三验证 1 使用vc验证 建立vc源程序,输入代码为 2 采用vb验证

其中关键是语句 Public Class Form1 Private Declare Function sq Lib"D:\vcb\plf\plf.dll" (ByVal i As Integer) As Integer Private Declare Function cub Lib"D:\vcb\plf\plf.dll" (ByVal j As Integer) As Integer

VB调用Matlab生成的dll完全攻略(混合编程必备)

用VB调用Matlab生成的dll MATLAB 具有强大的运算功能,VB 具有开发界面友好的特点,可以将二者结合,可以开发出脱离MATLAB 环境的VB程序,即利用VB调用Matlab生成的dll。 工具/原料 Microsft Visual Basic 6 Matlab 7.0 步骤/方法 在MA TLAB 系统中的命令输入comtool命令或点击左下角“Start- > MATLAB - > MA TLAB COMBuilder - > MATLAB COM Builder”,启动MATLAB COM Builder。 建立工程,选择菜单“File - > New Project”,设置工程参数。设置的工程名为COM 组件编译后的文件名称,也可以输入新类,点击“Add”建立新类。

点击菜单“Project - > Add File. . . ”,向工程中加入M或MEX文件。 点击菜单“Build - >COM Object. . . ”,状态窗口出现“Standalone DLL build complete.”说明生成dll成功。

注册生成的myfunc_1_0.dll,在VB中引用MWComUtil.dll和myfunc_1_0.dll,就可以像调用里边的函数了!

插入完成后,Visual Basic中的具体调用方法和命令 此时Matlab中定义的函数: function daoju_gonge(z,x,m,ha,c,b) (函数名daoju_gonge) VB调用 1.先对所有的参数进行定义(关键) Private z As Double Private x As Double Private m As Double Private ha As Double Private c As Double Private b As Double Private theDaoju As myDaoju.Daoju (theDaoju 是自己设定的一个VB中的变量,myDaoju 则是由.m文件编译而成的.dll文件文件名,同时也是其中定义的组件名Component name,daoju则是其类名Class name) 2.调用命令 Call theDaoju.Daoju_gonge(z, x, m, ha, c, b) 3.对VB进行初始化 Private Sub Form_Load() Set theDaoju = New myDaoju.Daoju End Sub 注意事项以及相应问题解决 1.在编译dll时,需要机器安装有C或C++编译器,比如安装VC++6.0 2.Matlab启动Comtool工具之前,还需要利用mbuild –setup 命令对compiler(转换器) 设 置,将转换器设置成C++/C语言对应的compiler,而不是Matlab自带的compiler。 Ps:前两条如果没有做到的话,在comtool生成界面往往出错,无法生成dll等相应的文件。 3.如果出现有其他一些小问题,尝试重启Visual Basic或Matlab,再或者重启电脑。 疑难点: 如果对文件进行处理,使其能够在其他电脑上同样实现设定的功能。 可选方案一:文件打包。 Visual Basic打包程序或是Matlab打包程序。

相关文档
最新文档