VS2010免注册调用大漠插件 您所在的位置:网站首页 大漠31233调用 VS2010免注册调用大漠插件

VS2010免注册调用大漠插件

2023-06-20 12:53| 来源: 网络整理| 查看: 265

    相信有很多人都想知道怎么实现免注册调用大漠DLL,最近看了个教程鼓捣了一天终于实现免注册调用大漠插件,作者帖子地址在此http://www.cctry.com/thread-267282-1-1.html,但是作者用的是VS2013,我用的是VS2010,用作者的这个方法时还是出现了一些问题,写这篇博客一是为了日后忘记后好查询,二是也可以方便后来人。    首先来建立一个基于对话框的MFC项目,作者直接提供了两个文件"RegDM.cpp"和"RegDM.h"把这两个文件放到自己建立的项目的源码列表和头文件列表中,本人照着操作编译VS2010提示这两个文件是高版本的VC++生成的文件,百度了半天也解决不了,后来想到一个办法用notepad++打开2个文件复制里头的代码后用VS2010新建一个空的.h和.cpp文件,把代码放进去保存,编译通过了。下面是RegDM.h文件里的代码:#import "dm.dll"//将dm.dll放在源码目录下#include "Release/dm.tlh"extern Dm::Idmsoft* GetDmbject();----------------------------------------------------------------------------------------RegDM.cpp里的代码:#include "stdafx.h"#include "RegDM.h"Dm::Idmsoft* GetDmbject(){typedef  HRESULT(__stdcall * PDllGetClassObject)(REFCLSID, REFIID, LPVOID*);PDllGetClassObject  pDllGetClassObject = NULL;HMODULE  h = ::LoadLibrary(L"dm.dll");if (h == 0){return  NULL;}pDllGetClassObject = (PDllGetClassObject)GetProcAddress(h, "DllGetClassObject");if (pDllGetClassObject == NULL){return  NULL;}IClassFactory* pcf = NULL;HRESULT hr = pDllGetClassObject(__uuidof(Dm::dmsoft), IID_IClassFactory, (void**)&pcf);if (SUCCEEDED(hr) && pcf != NULL){DWORD* PGetRes = NULL;hr = pcf->CreateInstance(NULL, IID_IUnknown, (void**)&PGetRes);if (SUCCEEDED(hr) && PGetRes != NULL){pcf->Release();return (Dm::Idmsoft*)PGetRes;}if (pcf != NULL){pcf->Release();}}if (pcf != NULL){pcf->Release();}return  NULL;}    这样处理以后VC不再说版本过高什么了,但是又说找不到"dm.tlh"这个文件,在作者提供的工程里找到这个文件,修改路径引用到自己的工程里,依旧报错,鼓捣了半天,直接注释掉RegDM.h文件里的第二行也就是:#include "Release/dm.tlh"    选择“生成解决方案”就会在项目的Debug文件夹或者Release文件夹下生成我们自己项目的dm.tlh文件,现在回到RegDM.h文件里,在第二行把dm.tlh文件换成当前项目dm.tlh文件的路径即可。

    现在Ctrl+F5生成一下看看,这下正常了,不报错了。编译通过,可以正常操作大漠了。编译成release版本试试?双击运行报错,此时把大漠的"dm.dll"放入Release文件夹下,再次打开,就能正常运行了,此时把这个文件夹发送到其他的电脑上,没有注册大漠插件的电脑也能正常使用了。关于如何把Debug版本换成Release版本的方法就请自行百度了,很容易找到。

"const char*"类型的实参与"LPCTSTR"类型的形参不兼容这是因为工程默认编码为Unicode,比如下面这句:SetDlgItemText(IDC_EDIT2,"vc");这是改变编辑框或者内容的函数,参数2是要修改的结果字符串,直接输入的话因为是在Unicode编码下建立的工程,所以会和LPCTSTR类型不符,此时需要在字符串前加"L"即:SetDlgItemText(IDC_EDIT2,L"vc");转换类型,或在字符串前加_T(),括号内包裹字符串,即:SetDlgItemText(IDC_EDIT2,_T("vc"));

还有记得在你的工程文件×××Dlg.cpp下#include "RegDM.h"。

VC大漠一个找图的例子:        Dm::Idmsoft *dm = GetDmbject();//创建一个指针变量,并获取大漠对象地址,然后存到dm里.//MessageBox(dm->Ver(), "大漠版本号", MB_OK); //::MessageBox(NULL, L"大漠版本号",L"hah" ,0);//dm->BindWindow(68340,"normal","normal","normal",0);VARIANT x,y;int q=2;while(q==2)  //条件为非0时才开始循环{dm->FindPic(405,210,433,233, L"C:\jsq.bmp", "000000",0.9,0,&x,&y); //坐标返回值是一个指针    if (x.lVal>0)      {MessageBox(L"找到了");dm->MoveTo(600,215);Sleep(100);dm->LeftClick();q++;    }Sleep(300);return;}经过断断续续一个星期的努力总算做出一个比较完整的例子了,工程是用VS2010制作,在这里发出来方便后来人。

这里还要多说一句,从Debug到Release的转换也要先注释掉RegDM.h文件里的#include "Release/dm.tlh",然后按F7生成解决方案,再把项目源码文件夹下的Release新生成dm.tlh文件include到RegDM.h文件中去才能正常编译。

示例工程:http://download.csdn.net/detail/l198738655/9903606 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有