首頁 web前端 js教程 DLL+ ActiveX控件+WEB页面调用例子_javascript技巧

DLL+ ActiveX控件+WEB页面调用例子_javascript技巧

May 16, 2016 pm 06:21 PM
activex控制項 dll

一、 概述
因项目需要,开始学习并研究VC、DLL及ActiveX控件,网上资料找了很多,但没一个可用的或者说没一个例子可理解并运行的。没办法,自己研究吧。功夫不负有心人,终有小成了,呵呵,现在把自己学习总结了一下,献给需要的人。
DLL(动态链接库): 分WIN32 DLL和MFC DLL
ActiveX:分ATL控件和MFC控件两类(也是一个DLL)
WEB:JAVASCRIPT 调用-> ActiveX调用-> DLL 完成加法运算并返回值,在页面上显示。
二、开发(VS2008)
1、DLL 库编写:
文件-》新建-》WIN32控制台->填写项目名称-》选择DLL-》空项目-》完成。
(1)在解决方案面板中,加入一个头文件testdll.h,内容:
复制代码 代码如下:

#ifndef _DLLTUT_DLL_H_
#define _DLLTUT_DLL_H_
#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif
//extern "C"告诉编译器该部分可以在C/C++中使用。
extern "C"
{
DECLDIR int Add( int a, int b );
DECLDIR void Function( void );
}
#endif

(2)在解决方案面板中,加入一个实现文件testdll.cpp,内容:
复制代码 代码如下:

#include
#define DLL_EXPORT
#include "testdll.h"
extern "C"
{
// 这里主要用到 ADD 方法。
DECLDIR int Add( int a, int b )
{
return( a + b );
}
DECLDIR void Function( void )
{
std::cout }
}

(3)可选。新建一个WIN32控制台类,测试这个DLL。
文件-》新建-》WIN32控制台->填写项目名称-》选择控制台程序-》空项目-》完成。
在解决方案面板中,加入一个实现文件loaddll.cpp 内容:
复制代码 代码如下:

#include
#include
using namespace std;
typedef int (*AddFunc)(int,int); //定义指针函数、接口。
typedef void (*FunctionFunc)();
int main()
{
AddFunc _AddFunc;
FunctionFunc _FunctionFunc;
cout // L 表示使用UNICODE 字符集,要和项目的字符集保持一致。
HINSTANCE hInstLibrary = LoadLibrary(L"E:\\Project\\VS\\LoadDll\\Release\\TestDll.dll");
if (hInstLibrary == NULL)
{
cout FreeLibrary(hInstLibrary);
}else{
cout }
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
_FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function");
if ((_AddFunc == NULL) || (_FunctionFunc == NULL))
{
FreeLibrary(hInstLibrary);//释放
}else{
cout }
cout _FunctionFunc(); //
cin.get(); // 获得焦点,这样就不会程序就不会一闪而过了。
FreeLibrary(hInstLibrary);//调用完后,要释放内存。
return(1);
}

2、ActiveX 控件实现:
这里我们选择ATL控件实现,而非MFC ActiveX。
文件-》新建-》ATL项目->填写项目名称(“FROMYANTAI”)-》选择动态链接库(DLL)-》完成。
完成后,会在右边“解决方案资源管理器”生成很多头H文件和CPP实现文件,这些都是默认的不要修改。
(1)、添加一个ALT简单对象:鼠标邮件点击项目名称(刚才起的名字)选择-》添加类-》选择ATL简单对象。
下一步起一个名字:“ytiicrj”—》下一步:其他不变,在支持中,选择“连接点”和“IE对象支持”—》完成。
下一步给“ytiicrj”添加一个方法,以便WEB页面调用。在“类视图”选择“iytiicrj”(有个灰色的钥匙图标)鼠标右键添加-》添加方法。方法起名为“GetContent”-》参数属性选择IN,参数类型选择LONG 参数名 A –》添加;继续;参数属性选择IN,参数类型选择LONG 参数名 B –》添加;继续;参数属性选择OUT和RETVAL ,参数类型选择LONG* 参数名 out –》添加---》 点击完成。
这样就在ytiicrj.H头文件中添加了一个(在最后一行):
STDMETHOD(GetContent)(LONG a, LONG b, LONG* out);
并在ytiicrj.CPP文件中添加了一个实现类:
复制代码 代码如下:

STDMETHODIMP CCaluNumCtrl::GetContent(LONG a, LONG b, LONG* out)
{
// TODO: 在此添加实现代码
return S_OK;
}

(2)、在ytiicrj.H 文件中,调用DLL类库。代码如下:
// CaluNumCtrl.h : ytiicrj 的声明 黑体(粗体)部分是具体的实现,其他未动。
复制代码 代码如下:

#pragma once
#include "resource.h" // 主符号
#include //添加
#include "AtlActiveX_i.h"
#include "_ICaluNumCtrlEvents_CP.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全DCOM 支持的Windows Mobile 平台)上无法正确支持单线程COM 对象。定义_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制ATL 支持创建单线程COM 对象实现并允许使用其单线程COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非DCOM Windows CE 平台支持的唯一线程模型。"
#endif
// ytiicrj
class ATL_NO_VTABLE Cytiicrj :
//增加一下一行:安全提示解除,--当运行浏览器调用时,不会提示安全问题。
public IObjectSafetyImpl,
public CComObjectRootEx,
public CComCoClass,
public IConnectionPointContainerImpl,
public CProxy_ICaluNumCtrlEvents,
public IObjectWithSiteImpl,
public IDispatchImpl
{
public:
//以下三行实现定义。
typedef int (*AddFunc)(int,int); //类型定义,对应DLL ADD方法。Func自定义,随便写。
HINSTANCE hInstLibrary;
AddFunc _AddFunc; //类映射
Cytiicrj()
{
//开始调用DLL,进行计算。
hInstLibrary = LoadLibrary(L"TestDll.dll");//把写好的DLL文件放在此项目生成的目录下
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);//资源释放
}else{
}
//调用方法,返回方法句柄。
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
}
DECLARE_REGISTRY_RESOURCEID(IDR_CALUNUMCTRL)
BEGIN_COM_MAP(Cytiicrj)
COM_INTERFACE_ENTRY(ICaluNumCtrl)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)
//增加一下一行:安全提示解除,--当运行浏览器调用时,不会提示安全问题。
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(Cytiicrj)
CONNECTION_POINT_ENTRY(__uuidof(_ICaluNumCtrlEvents))
END_CONNECTION_POINT_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
FreeLibrary(hInstLibrary);
}
public:
STDMETHOD(GetContent)(LONG a, LONG b, LONG* out);
};
OBJECT_ENTRY_AUTO(__uuidof(CaluNumCtrl), Cytiicrj)

(3)、回到在ytiicrj.PP 文件中,添加实现代码如下:
复制代码 代码如下:

STDMETHODIMP CCaluNumCtrl::GetContent(LONG a, LONG b, LONG* out)
{
// TODO: 在此添加实现代码
int sum = this->_AddFunc(static_cast(a),static_cast(b));
*out = static_cast(sum);
this->_AtlFinalRelease();
return S_OK;
}

(4)、生成DLL:
这步很简单,选择 Release模式,点击项目进行生成(会提示选择REG32注册,那就选择被)。这样就在Release目录下生成了很多文件,我们要的就是一个DLL文件。
3、DLL和 ATL ActiveX 控件DLL 打包为CAB文件:
例如:生成test.CAB后,WEB页面就会提示下载安装。
(1)首先定义setup.inf文件:它描述了下载的内容和目标目录还有版本号及相应的DLL文件。这个要手动编写的,我的内容如下(对应名称自行修改吧):
复制代码 代码如下:

[version]
; version signature (same for both NT and Win95) do not remove
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
AtlActiveX.dll=AtlActiveX.dll
TestDll.dll=TestDll.dll
setup.inf=setup.inf
[install.files]
AtlActiveX.dll=AtlActiveX.dll
TestDll.dll=TestDll.dll
setup.inf=setup.inf
[AtlActiveX.dll]
clsid={4AE870B5-C7FB-4171-A47E-7F57AFD86F67}
file-win32-x86=thiscab
FileVersion=1,0,0,1
DestDir=11
RegisterServer=yes
[TestDll.dll]
file-win32-x86=thiscab
DestDir=11
FileVersion=1,0,0,1
RegisterServer=yes
[setup.inf]
file=thiscab
[RegisterFiles]
%11%\AtlActiveX.dll
; end of INF file

(2)整合资源:
将所用到的DLL全部放到一个目录下包括setup.inf文件,然后在开始运行:IExpress 命令去生成CAB包。
运行后,选择第一个,下一步,选择第三个,下一步,添加文件(选择你的DLL和INF文件),下一步,选择一个输出目录并创建一个CAB文件名,再选择第二个选项,下一步,选择第二个选项,然后OK。这样就生成了一个CAB文件。
(3)WEB页面调用 ActiveX 控件 进行加法运算 :
写一个test.htm网页和CAB文件放在一个目录,test.htm内容如下:
复制代码 代码如下:



New Page








说明: codeBase="test.CAB#version=9,0,0,1" codeBase表示文件相对或者绝对路径;version表示版本号,如果这个号和INF文件的版本号一样,那么第二次访问页面就不会下载,否则每次都下载。CLSID 是 ActiveX 项目生成的序号,具体可以在项目的*.rgs 文件中找到。
好了。所有的步骤都完成了,这时你运行test.htm,提示ActiveX控件,你选择允许,然后就可以调用加法运算了。
这只是一个简单的例子,在其中的DLL中,你可以实现自己的应用了。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
Nvgpucomp64.dll導致Windows PC遊戲崩潰; Nvgpucomp64.dll導致Windows PC遊戲崩潰; Mar 26, 2024 am 08:20 AM

如果Nvgpucomp64.dll導致遊戲經常崩潰,這裡提供的解決方案可能會對您有所幫助。這種問題通常是由於過時或損壞的顯示卡驅動程式、遊戲檔案損壞等原因引起的。修復這些問題可以幫助您解決遊戲崩潰的困擾。 Nvgpucomp64.dll檔案與NVIDIA顯示卡關聯。當這個檔案崩潰時,你的遊戲也會崩潰。這通常發生在《LordsoftheFallen》、《LiesofP》、《RocketLeague》和《ApexLegends》等遊戲中。 Nvgpucomp64.dll使WindowsPC上的遊戲崩潰如果N

Windows系統目錄CoreMessaging.dll檔案遺失找不到問題解析 Windows系統目錄CoreMessaging.dll檔案遺失找不到問題解析 Feb 11, 2024 pm 11:42 PM

很多的用戶在利用電腦玩遊戲的時候會出現提示coremessaging.dll丟失的情況,相信很多的用戶們第一時間都會覺得軟體或者是遊戲的問題,其實不是的,這是因為電腦缺少了dll文件,用戶可以去下載coremessaging.dll檔案就可以了。下面就讓本站來為使用者來仔細的介紹一下Windows系統目錄CoreMessaging.dll檔案遺失找不到問題解析吧。 Windows系統目錄CoreMessaging.dll檔案遺失找不到問題解析1、下載CoreMessaging.dll檔案2、將

activex部件不能創建物件如何解決 activex部件不能創建物件如何解決 Jan 24, 2024 pm 02:48 PM

解決方法:1、檢查拼字和路徑;2、新增對元件的引用;3、檢查登錄;4、以管理員身份運作;5、更新或修復Office;6、檢查安全軟體;7、使用其他版本的組件;8、查看錯誤訊息;9、尋找其他解決方案。詳細介紹:1、檢查拼字和路徑:確保物件的名稱和路徑沒有拼字錯誤,且檔案確實存在於指定的路徑中;2、新增對組件的參考等等。

win7系統遺失libcurl.dll怎麼解決? win7找不到libcurl.dll檔案解決方法 win7系統遺失libcurl.dll怎麼解決? win7找不到libcurl.dll檔案解決方法 Feb 12, 2024 am 08:15 AM

win7系統遺失libcurl.dll怎麼解決?一般都是dll檔案都會導致部分程式無法正常使用,面對這個問題,很多用戶都不知道該如何解決,針對這個情況,今日小編就來和廣大用戶們分享詳細的解決方法,希望今日win7教程能夠為廣大的用戶們帶來幫助,一起來了解看看吧。 win7系統遺失libcurl.dll解決方法1、下載libcurl.dll檔。 2.下載好後將檔案放入對應的資料夾,這裡分32位元和64位元作業系統路徑如下:32位元Win7作業系統將檔案直接複製到C:\Windows\SYSTEM32

Win7啟動遊戲提示電腦中遺失Skidrow.dll怎麼辦? Win7啟動遊戲提示電腦中遺失Skidrow.dll怎麼辦? Feb 15, 2024 pm 02:12 PM

許多使用者喜歡使用電腦玩遊戲,最近有Win7系統的使用者反映在啟動遊戲的時候,遇到了系統提示電腦中遺失Skidrow.dll檔案無法啟動的彈跳窗,沒辦法正常載入遊戲,這是怎麼回事呢?針對這一問題,本篇帶來了詳細的解決方法,分享給大家,一起看看吧。 Win7啟動遊戲提示電腦中遺失Skidrow.dll怎麼辦? 1、下載Skidrow.dll檔。 2.解壓縮該資料夾,然後將Skidrow.dll檔案複製到系統目錄下。 32位元系統:C:\WINNT\System3264位元系統:C:\Windows\SysWOW

activex控制項是什麼意思 activex控制項是什麼意思 Sep 23, 2021 am 11:00 AM

ActiveX控制項指的是“插件程式”,是用於互聯網的很小的程序,是一種可重複使用的軟體元件,透過使用ActiveX控件,可以很快地在網址、桌上型應用程式、以及開發工具中加入特殊的功能。

vcruntime140_1.dll無法繼續執行程式碼怎麼辦? vcruntime140_1.dll無法繼續執行程式碼怎麼辦? Feb 11, 2024 pm 05:00 PM

vcruntime140_1.dll是VisualC執行時期程式庫的一個組成部分,不少的使用者在使用MicrosoftVisualStudio進行開發時出現了vcruntime140_1.dll無法繼續執行程式碼的錯誤,那麼使用者遇到這種問題該怎麼辦?下面就讓本站來為使用者來仔細的介紹一下vcruntime140_1.dll無法繼續執行程式碼如何解決方法吧。 vcruntime140_1.dll遺失的原因卸載VisualC執行時間庫:誤操作或升級VisualC導致執行時庫遺失。病毒感染:惡意軟體移除或損壞vc

載入dll失敗怎麼辦 載入dll失敗怎麼辦 Jan 25, 2024 pm 05:51 PM

解決方法:1、重新下載或從可靠的來源取得DLL檔案;2、檢查DLL檔案的依賴;3、確保使用的是正確的DLL版本;4、註冊DLL檔案;5、檢查防火牆和安全軟體設置;6、聯絡軟體供應商或技術支援。

See all articles