在使用laser DESK远程控制以及PMAC控制卡中COM库调用问题
我之前写过一篇COM库调用的文章,但是现在看来说的并不算是详细,我今天打算好好总结一下我自己在项目中是如何一步步解决COM库的调用的。
第一:COM库我目前碰到了两种,一种是laser DESK的先给了一个.DLL文件,然后我们要用微软的程序集自己生成TLB文件,方法如下,其实网上有很多需要找到适合自己电脑版本的哪一款,我提供的方法仅供参考。另外一种是PMAC提供的一个exe文件,也是库文件但是不需要转化为TLB格式的。
第二:当我们有了TLB格式或者EXE格式的COM库以后,要使用下面的方法把它加载到MFC工程中:
第三:在自动生成的头文件里边通常都会有如下这种格式的代码,这行代码是非常重要的,
#import "C:\\Users\\23740\\Desktop\\项目文件\\IMAC\\Turbo PcommServer.exe" no_namespace
但是,有些仅仅是这一句话并不够,会发现项目出现了好多无法识别的标识符的问题,这个时候你需要另外一个步骤,这个步骤对于COM库的调用来说是没有坏处的,我建议为了保险还是每次都手动加上,代码是要放在你对话框的头文件当中,类似MFCApplication2Dlg.h 这样的,在#pragma once之后加上
#import "c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb"
#include "CSLLD_Functions.h" //这个就是类型库自己生成的头文件
这个mscorlib.tlb文件对于很多C#写的库来说都是非常重要的文件,只需要知道这一点就行了。然后再注意一点,一定要使用你生成TLB文件时候的版本文件夹,不同电脑需要用不同版本的RegAsm.exe来生成TLB文件,这个大家放心,版本不对的话你是无法生成的,只要成功生成的那个版本就是适合你电脑的版本,像v4.0.30319就是版本文件夹的名字,这个网上有很多,大家可以自己去看我在这里就不再多说了。
第四:还有一点大家需要注意,你像laser DESK这种提供DLL自己生成TLB的,你还需要一个步骤,就是把他们给的DLL文件放到你MFC的exe文件夹下面,自己生成的TLB是不需要放的,只需要放这一个,下面是截图:
第五:在使用COM库的时候初始化是你必须要做的一件事,这件事万万不能忘记,初始化的代码有很多,你像AfxOleInit(); CoInitialize(NULL);CoInitializeEx(NULL);都是经常用的,你可以一个个试,也可以全都加上,但这个步骤是必须要有的,具体用哪个或者是否选择全部都加上是大家需要自己去尝试的。
第六:像很多第三方软件即便你上面都完成了,可能还是无法正常使用COM库的功能,那是因为往往会有他们自己的初始化函数,你需要在调用COM库的命令之前加上他们自己的初始化函数,就拿PMAC来说:
long test = pmacDevice.CreateDispatch(_T("PcommServer.PmacDevice.1"));
是需要你在调用命令之前必须加上的代码,当然了也别忘了CoInitialize(NULL)这样的初始化代码,是需要连在一块使用的。在laser DESK使用的时候我并没有碰到这个问题,他是使用安全数组加环回地址实现远程控制。哦对了,在PMAC中你经常会碰到运动程序启动了无法发送指令或者程序崩溃的问题,我给大家顺便说一下我的解决办法:首先
BSTR resp[1024];
string cmd;
LPCTSTR Bcmd;
long status;
这种代码在PMAC使用中经常用到,你要注意BSTR类型的使用,有时候你是不可以使用BSTR类型数组来获得PMAC的下位机参数目前的值的,你可以使用BSTR resp = NULL来充当参数,下位机参数当前的值一样会放到resp里边,程序崩溃的问题有可能是这个导致的。
其次,如果碰到莫名崩溃,比如你就是无法实现在运动程序开启以后修改M、P或者其他变量的值,即便是分开一个线程都不可以,这个时候你可以试试各自放在一个线程里边,我碰到的问题这样的确是可以解决的,而且程序也没有崩溃。
好了,目前我想说的就这么多,希望能对大家有所帮助,如果后续我再碰到什么问题解决以后我会再写博客记录。