c#制作activex控件其他文件应该放在哪 比如说引用的dll和相关的配置文件*.ini

c#制作activex控件其他文件应该放在哪 比如说引用的dll和相关的配置文件*.ini,第1张

你得先下载一个kernel32dll然后在你的项目中添加引用下面是我做过的一个例子,你可以参考一下publicclassinifile{#region导入dll函数[DllImport("kernel32dll")]publicexternstaticintGetPrivateProfileIntA(stringsegname,stringkeyname,intidefault,stringfilename);[DllImport("kernel32dll")]publicexternstaticintGetPrivateProfileStringA(stringsegname,stringkeyname,stringsdefault,StringBuilderretvalue,intnsize,stringfilename);[DllImport("kernel32dll")]publicexternstaticintGetPrivateProfileSectionA(stringsegname,byte[]sdata,intnsize,stringfilename);[DllImport("kernel32dll")]publicexternstaticintWritePrivateProfileSectionA(stringsegname,byte[]sdata,stringfilename);[DllImport("kernel32dll")]publicexternstaticintWritePrivateProfileStringA(stringsegname,stringkeyname,stringsvalue,stringfilename);[DllImport("kernel32dll")]publicexternstaticintGetPrivateProfileSectionNamesA(byte[]vdata,intilen,stringfilename);#endregionprivatestring_path;//////所有的设置节///publicinisegmentssegments;//////构造函数//////ini文件路径publicinifile(stringvpath){_path=vpath;segments=newinisegments(this);byte[]bufsegs=newbyte[32767];intrel=GetPrivateProfileSectionNamesA(bufsegs,32767,_path);inticnt,ipos;stringtmp;if(rel>0){icnt=0;ipos=0;for(icnt=0;icnt///获取ini文件路径///publicstringpath{get{return_path;}}//////读取一个整数型的设置值//////设置节名///设置项名///默认值///设置值publicintgetint(stringsegname,stringkeyname,intidefault){returnGetPrivateProfileIntA(segname,keyname,idefault,_path);}//////读取一个字符串型设置值//////设置节名///设置项名///默认值///设置值publicstringgetstring(stringsegname,stringkeyname,stringsdefault){StringBuilderred=newStringBuilder(1024);GetPrivateProfileStringA(segname,keyname,"",red,1024,_path);returnredToString();}//////写入设置项//////设置节名///设置项名///设置值publicvoidsetstring(stringsegname,stringkeyname,stringvvalue){WritePrivateProfileStringA(segname,keyname,vvalue,_path);}//////写入一个设置节//////设置节名///数据//////数据为多个设置项组成的字符串,每个设置项之间用"\0"分割///字符串最后用"\0\0"结束/////////writesegment(segname,"\0\0");能用于清除一个设置节下的所有设置项///publicvoidwritesegment(stringsegname,stringvdata){WritePrivateProfileSectionA(segname,SystemTextASCIIEncodingDefaultGetBytes(vdata),_path);}//////读取一个设置节下面的所有设置项//////要读取的设置节publicvoidgetsegment(inisegmento){byte[]vdata=newbyte[32767];intrlen=GetPrivateProfileSectionA(oname,vdata,32767,_path);oitemsClear();if(rlen<1)return;stringtmp="";intipos,icnt;ipos=0;for(icnt=0;icnt

控件下载失败的原因分析:

1 浏览器安全级别过高,电脑安全级别高:Win70, Vista 的安全级别比winxp高。IE80和IE70的安全设置和IE60也不一样。

2 相关杀毒软件或者硬盘保护程序阻止控件写入系统盘,此时注册成功,但是具体dll无法写入。

3 写入成功,但是注册表无法写入,每次运行都会重新注册安装。

4 OS安装时,缺失相关dll,导致无法下载,比如jscriptdll等。

解决方法:

1 针对浏览器安全级别较高的,可以调低浏览器安全级别此方法,解决率低。

Internet选项-安全设置-下载已签名的ActiveX控件是否设置为“禁用”,改为“提示”。

2 手动注册控件。

半手动注册(依赖于控件已经下载到本地), [开始] ,[运行] , 输入regsvr32 + "dll路径" : regsvr32 "c:\windows\Downloaded Program Files\TBAppLdrdll"(注意不同的ie控件所处地址不同)。

ActiveX控件的优点:用ActiveX控件可快速实现小型的组件重用、代码共享,从而提高编程效率,降低开发成本。

但是ActiveX控件对于最终用户并不能直接使用,因为ActiveX控件必须先在Windows中注册。

本文总结注册ActiveX控件的六种办法,它们有各有千秋,应用范围各异。

一、Regsvr32exe注册

这种方法是比较常用的。

Regsvr32exe位于Windows目录的system子目录下。点击Windows的“开始→运行”菜单,在对话框中输入以下命令:(这里以netshareocx控件为例)

regsvr32 netshareocx 注册netshareocx控件

regsvr32 /u netshareocx 解除netshareocx控件的注册

如果netshareocx文件不在system目录时,还必须在文件名前加上完整的路径。

二、除了regsvr32应用程序之外,Microsoft在它的Web站点上还提供了一个称为regcleanexe的程序,可以检查注册表并去掉丢失的组件在注册表中的条目。regcleanexe除了可以删除“悬挂”的条目,它还提供一个“undo”文件帮助恢复错误的删除。

三、VFP环境注册

打开VFP,选择“工具→选项”菜单,点击“控件”页,选中“ActiveX控件”单选按钮,在列表框里显示所有已经注册的ActiveX控件,这时,点击右边的“添加”按钮,选择需要注册的ActiveX控件文件,“确定”后完成注册。也可以在表单设计器的表单控件工具栏里拖动“OLE”按钮到表单,在d出的选择框里选中“插入控件”单选钮,同样点击右边的“添加控件”按钮,来完成新控件的注册。

三、安装程序注册

大型应用软件一般都有一个安装程序,在安装程序中解决ActiveX控件的注册是较为理想的一种方案。

在用户执行安装程序时,这些ActiveX控件将自动在用户机器上安装并注册。

VFP70光盘所带的InstallShield是目前较为流行的制作安装程序的工具,使用它可以制作出专业级的Setup安装程序,还可以注册应用程序使用到的ActiveX控件。而且,在以后使用控制面板的“添加/删除程序”卸载该软件时,安装程序会自动注销掉以前注册的ActiveX控件。

四、加入代码注册

首先,定义一个注册控件的函数:

Function MyRegsvr ( lpcRegFilename, lplIsreg )

If File(lpcRegFilename)

lpcRegFilename = iif(llisreg, lpcRegFilename, [ /u ] + lpcRegFilename)

Run /n regsvr32 &&lpcRegFilename

Endif

Return

Endfunc

然后就可以通过以下语句来调用该函数,并完成ActiveX控件的注册了(这里要注意一下控件文件的路径)。

= MyRegsvr( "netshareocx", T) //注册netshareocx控件

= MyRegsvr( "netshareocx", F) //解除netshareocx控件的注册

五、注册函数注册

上面提到运行regsvr32exe应用程序将d出注册是否成功的对话框,注意看内容“DllRegisterServer in netshareocx succeeded”或“UnDllregisterServer”,其实,通常每个可用的ActiveX控件都有DllRegisterServer、UnDllregisterServer这两个自注册函数包含在其中,我们可以用定义API函数的方法(Declare <函数名> in <文件名> )来定义它,然后直接使用该函数来进行注册和反注册。

同样,我们先自定义一个注册函数(请注意DllRegisterServer、UnDllregisterServer的大小写):

Function DllRegister (lpLibFileName,isReg)

isReg = iif(type("isReg")="U", T, isReg)

lpProcName = iif(isReg, "DllRegisterServer", "DllUnregisterServer" )

Declare INTEGER (lpProcName) in (lpLibFileName)

return &&lpProcName()

Endfunc

然后,就可以通过该函数来完成ActiveX控件的注册了。

= DllRegister( "netshareocx", T) //注册,返回0表示成功

= DllRegister( "netshareocx", F) //注销,返回0表示成功

Clear Dlls

试试,是不是没有了d出框的烦恼!

注意:该方法没有对ActiveX控件文件的验证,假如该控件没有有效的DllRegisterServer功能(即不具有自注册功能),也就找不到以上的两个API函数,照样会有错误信息d出。

六、API函数注册

此方法的设计思路是:先将ActiveX控件载入内存,然后验证其有效性,最后直接在内存地址中执行其注册函数(DllRegisterServer、UnDllregisterServer)。其编程方法是:

1、使用Windows API函数LoadLibrary载入ActiveX控件;

2、使用GetProcAddress函数获取ActiveX控件中注册函数DllRegisterServer(注销函数为DllUnregisterserver)指针;

3、使用CallWindowProc函数执行已载入内存的ActiveX控件注册函数(DllRegisterServer、UnDllregisterServer)。

上面所述的ActiveX控件注册方法各有特点。经实际使用,效果良好。各位可以根据实际情况灵活选用。

在注册表中找但很麻烦一般网上就有,

找到这样的classid后记住就可以了,一般最重要的是两个,一个是windows

media

player,还有一个是

说的realplayer这两个是最最主要的插件记住这两个就可以了在注册表中查找

clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa这个是realplayer的

注册表的路径是:hkey_classes_root\clsid\{cfcda953-8be4-11cf-b84b-0020afbbccfa}

classid="clsid:05589fa1-c356-11ce-bf01-00aa0055595a"这个是media

player的

注册表的路径是hkey_classes_root\clsid\{05589fa1-c356-11ce-bf01-00aa0055595a}

在注册表中找到路径后,在后面就会显示是什么的classid了

ActiveX技术虽然是一项古老的技术,但是却有着广泛的应用,支付宝的密码输入控件,各大银行的密码输入控件,网页聊天室中的截屏功能,网页播放器中的p2p播放甚至Flash,Silverlight等等,在IE中都表现为ActiveX。虽然C#也能开发"用于网页的com应用",能达到类似ActiveX的效果,但是有一个要命的问题是必须得安装几百M的net Framework框架,如果仅仅为了安全的输入一个密码,而要用户下载几百M的安装程序,这是很多人不能接受的,Delphi做为win32下的原生开发工具,能很好的支持微软各种"古老"的经典技术。(再做点小广告:delphi的kyrix版本还能编译跨平台的应用哦!)

ok,开工吧:

开发工具:推荐用delphi 2010(d7也可以,不过添加属性,方法等过程要手动,稍微麻烦点) 

1启用delphi2010-->File->New->Other-->Active Library

2项目命名为MyActiveX

3File-->Save All 全部保存

实际上这样就能编译了,不过只是空的dll

4File-->New-->Other-->Active Form

改名为MyForm

将对应的单元文件,保存为UMyFormpas

5打开MyAcitveXridl文件,切换到design视图,选中IMyForm接口,右击New-->Property

添加一个属性Msg

将Msg属性的Type改为BSTR 即WideString类型

完了之后,点击工具栏中的Refresh

Implementation(即上图中工具栏中圈起来的部分)--这一步很重要,点击之后,它将自动生成属性Msg对应的声明和实现代码模板

6打开UMyFormpas--即ActiveForm对应的单元,找到Set_Msg以及Get_Msg的实现部分,补充代码如下:

function TMyFormGet_Msg: WideString;

begin

result:=_msg;

end;

procedure TMyFormSet_Msg(const Value: WideString);

begin

_msg := value;

end;

当然TMyForm的private部分,得先加一个私有成员 

type

TMyForm = class(TActiveForm, IMyForm)

private

{ Private declarations }

_msg:WideString;

这样我们就为即将生成的ActiveX控件,添加了一个字符串类型的属性Msg,下面来测试一下:

7编译项目,会生成一个MyActiveXocx,在运行栏里输入

regsvr32 C:\Users\jimmyyang\Desktop\Delphi_activex\MyActiveX\MyActiveXocx

注:这里ocx的路径,请各位根据自己的实际路径修改

这样就完成了ocx的注册。

8放到html里测试一下:

<OBJECT ID='x' name='x' CLASSID='CLSID:52D17094-0687-4A2F-B2DB-30F3189AC659' align=center hspace=0 vspace=0 ></OBJECT>

<script type='text/JavaScript'>

var x = documentgetElementById("x");

alert(xMsg);

</script>

关于CLSID在哪里查看,打开:MyActiveX_TLBpas文件,定位到下面这里:

const

// TypeLibrary Major and minor versions

MyActiveXMajorVersion = 1;

MyActiveXMinorVersion = 0;

LIBID_MyActiveX: TGUID = '{49138437-8265-4B1A-9EAE-D0F615D68464}';

IID_IMyForm: TGUID = '{54A20855-29A3-4C92-85DE-A419DA457C7A}';

DIID_IMyFormEvents: TGUID = '{60BBC967-E1E6-4E98-BAE5-776BFD06E9CC}';

CLASS_MyForm: TGUID = '{52D17094-0687-4A2F-B2DB-30F3189AC659}';

其中 CLASS_MyForm: TGUID对应的就是ClassID

运行后,除了d出一个空白的警告框,暂时看不到其它:)(可不就是这样么?Msg属性没给任何初始值,当然是空字符串,所以d出一个空的警告框是正常的)

9我们再来添加一些控件和方法,以验证刚才设置的属性确实有效

在MyForm上添加一个文件框,一个按钮

按钮的事件如下:

procedure TMyFormButton1Click(Sender: TObject);

begin

_msg:= selfEdit1Text;

end;

即把文本框的值赋给属性Msg

再继续定位到Set_Msg,略做修改

procedure TMyFormSet_Msg(const Value: WideString);

begin

_msg := value;

selfEdit1Text := _msg;

end;

即设置Msg属性时,同时也把值显示在文本框里,以便等会儿我们好测试在js中给activeX属性赋值的效果

ok了,再来测试一下,编译一下,如果通不过,请先运行

regsvr32 C:\Users\jimmyyang\Desktop\Delphi_activex\MyActiveX\MyActiveXocx /u

将刚才注册的ocx反注册,同时关掉浏览器,不然该ocx文件一直被占用,无法更新

修改一下html的代码:

<OBJECT ID='x' name='x' CLASSID='CLSID:52D17094-0687-4A2F-B2DB-30F3189AC659' align=center hspace=0 vspace=0 ></OBJECT>

<hr />

<input type='button' value='显示Msg属性的值' onclick='ShowMsg()'/>

<input type='button' value='设置Msg属性的值' onclick='SetMsg()'/>

<script type='text/JavaScript'>

var x = documentgetElementById("x");

var ShowMsg = function(){

alert(xMsg);

}

var SetMsg = function(){

xMsg = 'js传过来的值';

}

</script>

以上就是关于c#制作activex控件其他文件应该放在哪 比如说引用的dll和相关的配置文件*.ini全部的内容,包括:c#制作activex控件其他文件应该放在哪 比如说引用的dll和相关的配置文件*.ini、ActiveX控件无法使用问题一直无法解决、如何注册ActiveX控件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9554605.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存