问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VB 控件使用问题,高手请进

发布网友 发布时间:2022-05-11 05:52

我来回答

2个回答

热心网友 时间:2024-02-10 02:41

用CreateObject方法创建控件,或者把对应的文件打包在同一目录,或者打包进程序里面待使用的时候再动态释放出来,还有两种动态调用的方法可供参考:



(1)VB使用未注册的ActiveX代码

''IDE下可以引用那个dll使用。编译后可以在未注册dll的计算机上正常工作了。
  ''使用方法:
  ''Dim pDll As Long ''记录Dll,用来最后完美释放
  ''Dim Update As Update.Handle ''要实例化的对象
  ''Set Update = LoadObjectByName(App.Path & "Update.dll", "Handle", pDll) '' New Update.Handle
  ''If Update Is Nothing Then Exit Sub
  ''Update.Test ''<--类中的方法
  ''Set Update = Nothing ''<-----这句不能少,否则会出现意外错误
  ''UnLoadDll pDll ''<----释放

  ''模块中:
  Option Explicit
  Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryW" (ByVal lpLibFileName As Long) As Long
  Private Declare Function GetProcAddress Lib "kernel32" (ByVal hMole As Long, ByVal lpProcName As String) As Long
  Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibMole As Long) As Long
  Private Declare Function CallAsmCode Lib "user32" Alias "CallWindowProcW" (FirstAsmCode As Long, ByVal pA As Long, ByVal pB As Long, ByVal pC As Long, lpD As Long) As Long
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  Private AsmCode(94) As Long

  Function LoadObjectByName(ByVal DllPath As String, ByVal ClsName As String, pDll As Long) As Object
  Dim pObj As Long, TLIAPP As Object, TLI As Object
  Dim CLSID As String, IID As String, IIDName As String
  On Error GoTo Err
  Set TLIAPP = CreateObject("TLI.TLIApplication")
  Set TLI = TLIAPP.TypeLibInfoFromFile(DllPath)
  IIDName = "_" & Trim(ClsName)
  CLSID = TLI.GetTypeInfo(Trim(ClsName)).GUID
  IID = TLI.GetTypeInfo(Trim(IIDName)).GUID
  Set LoadObjectByName = LoadObjectByID(DllPath, CLSID, IID, pDll)
  Set TLI = Nothing
  Err:
  End Function

  Function LoadObjectByID(ByVal DllPath As String, ByVal CLSID As String, ByVal IID As String, pDll As Long) As Object
  Dim pObj As Long
  Call InitAsmCode
  pObj = CallAsmCode(AsmCode(20), StrPtr(DllPath), StrPtr(CLSID), StrPtr(IID), pDll)
  CopyMemory LoadObjectByID, pObj&, 4&
  End Function
 
  Function UnLoadDll(pDll As Long) As Long
  Call InitAsmCode
  UnLoadDll = CallAsmCode(AsmCode(79), pDll, 0, 0, 0)
  End Function

  Private Sub InitAsmCode()
  If AsmCode(4) Then Exit Sub
  Dim pDll As Long
  pDll = LoadLibrary(StrPtr("kernel32"))
  AsmCode(0) = GetProcAddress(pDll, "LoadLibraryW")
  AsmCode(1) = GetProcAddress(pDll, "GetProcAddress")
  AsmCode(2) = GetProcAddress(pDll, "FreeLibrary")
  Call FreeLibrary(pDll)
  AsmCode(4) = &H476C6C44
  AsmCode(5) = &H6C437465
  AsmCode(6) = &H4F737361
  AsmCode(7) = &H63656A62
  AsmCode(8) = &H4C430074
  AsmCode(9) = &H46444953
  AsmCode(10) = &H536D6F72
  AsmCode(11) = &H6E697274
  AsmCode(12) = &H10067
  AsmCode(13) = &H0&
  AsmCode(14) = &HC00000
  AsmCode(15) = &H0&
  AsmCode(16) = &H6F4600
  AsmCode(17) = &H65006C
  AsmCode(18) = &H320033
  AsmCode(19) = &H0&
  AsmCode(20) = &H83EC8B55 ''创建对象函数入口
  AsmCode(21) = &HE853D8C4
  AsmCode(22) = &H0&
  AsmCode(23) = &H6CEB815B
  AsmCode(24) = &H8D100010
  AsmCode(25) = &H105293
  AsmCode(26) = &H93FF5210
  AsmCode(27) = &H10001010
  AsmCode(28) = &H32938D50
  AsmCode(29) = &H52100010
  AsmCode(30) = &H1493FF50
  AsmCode(31) = &H8D100010
  AsmCode(32) = &H101C93
  AsmCode(33) = &HFF028910
  AsmCode(34) = &H101893
  AsmCode(35) = &H875FF10
  AsmCode(36) = &H101093FF
  AsmCode(37) = &HC00B1000
  AsmCode(38) = &H86840F
  AsmCode(39) = &H45890000
  AsmCode(40) = &H20938DFC
  AsmCode(41) = &H52100010
  AsmCode(42) = &H1493FF50
  AsmCode(43) = &HB100010
  AsmCode(44) = &H506674C0
  AsmCode(45) = &H52EC558D
  AsmCode(46) = &HFF0C75FF
  AsmCode(47) = &H101C93
  AsmCode(48) = &H558D5810
  AsmCode(49) = &H938D52D8
  AsmCode(50) = &H10001042
  AsmCode(51) = &HEC558D52
  AsmCode(52) = &HBD0FF52
  AsmCode(53) = &H8D3E75C0
  AsmCode(54) = &HFF52DC55
  AsmCode(55) = &H93FF1075
  AsmCode(56) = &H1000101C
  AsmCode(57) = &HD8558B50
  AsmCode(58) = &H8D54128B
  AsmCode(59) = &H6A50DC45
  AsmCode(60) = &HD875FF00
  AsmCode(61) = &HB0C52FF
  AsmCode(62) = &H8B1575C0
  AsmCode(63) = &H4D8BFC45
  AsmCode(64) = &H59018914
  AsmCode(65) = &H8BD18B51
  AsmCode(66) = &H52FF5112
  AsmCode(67) = &H14EB5804
  AsmCode(68) = &HEB06EB58
  AsmCode(69) = &HEB02EB0F
  AsmCode(70) = &HFC75FF0B
  AsmCode(71) = &H101893FF
  AsmCode(72) = &HC0331000
  AsmCode(73) = &H10C2C95B
  AsmCode(74) = &H6C6C4400
  AsmCode(75) = &H556E6143
  AsmCode(76) = &H616F6C6E
  AsmCode(77) = &H776F4E64
  AsmCode(78) = &H0&
  AsmCode(79) = &H53EC8B55 ''尝试卸载DLL函数入口
  AsmCode(80) = &HE8&
  AsmCode(81) = &HEB815B00
  AsmCode(82) = &H10001155
  AsmCode(83) = &H1139938D
  AsmCode(84) = &HFF521000
  AsmCode(85) = &H93FF0875
  AsmCode(86) = &H10001014
  AsmCode(87) = &H1374C00B
  AsmCode(88) = &HC00BD0FF
  AsmCode(89) = &H75FF0E74
  AsmCode(90) = &H1893FF08
  AsmCode(91) = &H33100010
  AsmCode(92) = &H4801EBC0
  AsmCode(93) = &H10C2C95B
  AsmCode(94) = &H90909000
  End Sub



(2)vb.net 通过类厂创建com对象的方法

     vb.net中要创立com对象可以用new或者CreateObject,就像C++中的CoCreateInstance,一步调用就直接创建了com对象。在它们之中包括了对CoGetClassObject和CreateInstance的调用。默认使用的类厂是IClassFactory。 

    一般情况下,new或CreateObject已经够用了。但是如果我们的com组件增加了授权,也就是使用了IClassFactory2接口。那么在vb中继续用这种方法就不能创建我们所需要的组件了。我们必须使用IClassFactory2。
    在C++中实现很简单。只需要通过CoGetClassObject获得IClassFactory2接口,然后调用它的CreateInstanceLic来创建组件。
    因此,在vb.net中,我们就可以仿照c++中的方法。下面是相关代码:
    首先声明IClassFactory2的接口。IClassFactory2.idl如下:

[
    uuid(6ED6AF97-F279-4d57-A392-0B8ACF89426C),
    version(1.0),
    helpstring("INVENTOROCIDL Type Library 1.0")
]
library INVENTOROCIDL
{
    interface IClassFactory2;

    typedef enum enuCLSCTX
    {
        enuCLSCTX_INPROC_SERVER    = 1,
        enuCLSCTX_INPROC_HANDLER   = 2,
        enuCLSCTX_LOCAL_SERVER     = 4,
        enuCLSCTX_REMOTE_SERVER    = 16,
        enuCLSCTX_NO_CODE_DOWNLOAD = 400,
        enuCLSCTX_NO_FAILURE_LOG = 4000,
        enuCLSCTX_SERVER    = (1 | 4 | 16),
        enuCLSCTX_ALL       = (2 | 1)
    } CLSCTX;

    [
        object,
        uuid(B196B28F-BAB4-101A-B69C-00AA00341D07),
        pointer_default(unique)
    ]

    interface IClassFactory2 : IClassFactory
    {
        typedef IClassFactory2 * LPCLASSFACTORY2;

        typedef struct tagLICINFO {
            LONG cbLicInfo;
            BOOL fRuntimeKeyAvail;
            BOOL fLicVerified;
        } LICINFO;

        typedef struct tagLICINFO * LPLICINFO;

        HRESULT GetLicInfo(
            [out, retval] LICINFO * pLicInfo
            );

        HRESULT RequestLicKey(
            [in] LONG dwReserved,
            [out, retval] BSTR * pBstrKey
            );

        [local]
        HRESULT CreateInstanceLic(
            [in] IUnknown * pUnkOuter,
            [in] IUnknown * pUnkReserved,
            [in] GUID* riid,
            [in] BSTR bstrKey,
            [out, retval, iid_is(riid)] PVOID * ppvObj
            );

    }
}

用midl编译成IClassFactory2.tlb,并导入到vb.net的工程当中。
声明如下api用于得到IClassFactory2接口:

    Declare Function CoGetClassObject Lib "ole32.dll" (ByRef rclsid As Guid, ByVal context As Short, ByRef serverInfo As IntPtr, ByRef riid As Guid, ByRef ppv As IntPtr) As Integer
'添加如下代码:

Const bstrInventorApplication As String = "{B6B5DC40-96E3-11d2-B774-0060B0F159EF}"
    Const bstrIClassFactory2 As String = "{B196B28F-BAB4-101A-B69C-00AA00341D07}"
    Const bstrIDispatch As String = "{00020400-0000-0000-C000-000000000046}"

    Private IClsFry2 As INVENTOROCIDL.IClassFactory2 
    Dim bstrLicence As String = "12345678"   'licence key
    Dim guidInventorApplication As Guid = New Guid(bstrInventorApplication)
    Dim guidIClassFactory2 As Guid = New Guid(bstrIClassFactory2)
    Dim guidIDispatch As Guid = New Guid(bstrIDispatch)
    Dim InventorGuid As INVENTOROCIDL.GUID  'used by CreateInstanceLic,defined in INVENTOROCIDL

     'transform Guid of IDispatch to INVENTOROCIDL.GUID
      Dim byteArry() As Byte = guidIDispatch.ToByteArray()
      Dim MyGC As GCHandle = GCHandle.Alloc(byteArry, GCHandleType.Pinned)
      InventorGuid = CType(Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, InventorGuid.GetType()), INVENTOROCIDL.GUID)

      'get the IClassFactory2 Interface
      Dim obj As IntPtr
      CoGetClassObject(guidInventorApplication, CInt(INVENTOROCIDL.enuCLSCTX.enuCLSCTX_LOCAL_SERVER), Nothing, guidIClassFactory2, obj)
       IClsFry2 = CType(Marshal.GetTypedObjectForIUnknown(obj, System.Type.GetTypeFromCLSID(guidIClassFactory2)), INVENTOROCIDL.IClassFactory2)

        'create Inventor Instance by using Licence
       obj = IClsFry2.CreateInstanceLic(Nothing, Nothing, InventorGuid, bstrLicence)
        InvApp = CType(Marshal.GetTypedObjectForIUnknown(obj, System.Type.GetTypeFromCLSID(guidInventorApplication)), Inventor.Application)

致此创建成功!

热心网友 时间:2024-02-10 02:42

有个最简单的办法了,

没有楼上的那么复杂

只需要把部件拖到窗体里,然后把你的程序打个安装包,用innosetup可以打包,打包时要注意加上注册控件命令,就ok了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不吃惊!冇我符!初生之犊不畏虎。有靠山?勿乱估:未曾痛过不知苦!能解... 不识惊!冇我符!初生之犊不畏虎。 有靠山,勿乱估。未曾通过不知苦... ...不识惊!冇我符!初生之犊不畏虎。有靠山?勿乱估。末曾痛过不知苦... 不识惊!冇我符! 初生之犊不畏虎。 有靠山?勿乱估。 未曾痛过不知苦... ...有靠山?勿乱估。未曾痛过不知苦?猜生肖!答案加理由。 跪求各位大仙,算命准的帮帮我 各位大神,网友大哥。我今天抽了支签,第十四签,请各位帮忙解一下。谢谢... 跪求各位有懂的帮忙解一下这个签!!! 紫金所为什么这么牛气? 战争机器5中文配音怎么设置 vb 写文件怎么写 T420HW08 V.1是哪个厂家屏 帮我找下康佳电视得资料 HG5412资料 黑白图像正常且无雪花,该机STR5412有时有吱吱声并伴随图像闪动,是否还有其它原因?我是新手望指教。 6脚电源芯片丝印A37K5N15是什么型号 造句,快~~~ ...一暴十寒”,“寸进尺退”,“有始无终”,“半途而废”如何造句? 卑以自牧,垂拱而治,载舟覆舟,择善而从,善始善终,居安思危,用这几个成语怎么造? 大公无私、舍近求远、若明若暗、承前启后、化难为易、善始善终、扬长避短、弃旧图新〉中的3个词造句 善()善() 成语填空 收售的信息可以投诉到哪里 亲们谁能用若隐若现,锲而不舍,彬彬有礼,冥思苦想,孤立无援,善始善终造句?任选三个以上,50字左右 用善始善终造句 善XX终的成语? 怎么投诉qq诈骗 那位高手有2010cad电气原理设计的元件库,麻烦给传一个,跪求,不胜感激涕零! cad怎么弄元件库? 新手,主要画电气元件,网上有标准的电气元件库么? 如果我自己画元件做一个可以 微信:如何不让陌生人拿我手机看我微信朋友圈 怎样不让别人看到自己手机里微信朋友圈 编了一个程序,结果就循环了一次,结果就出第一次循环的,结果,为什么呢?请高手来解答。 标题用自己的话总结一下,通过几节课的学习,你对html影响最深的知识点是什么? 梦见男朋友买凉鞋送给女朋友是什么像征 银联境外取款,汇率是按现汇还是现钞 泰国曼谷哪个ATM取钱汇率最高 – 手机爱问 从国外汇来欧元 汇率是多少 如何取款 我一个客户从国外给我打了12620美金,我从银行取钱时(人民币)汇率该按什么时候的算呢? 境外atm取现汇率和国内银行柜台换汇一样吗 同花顺上购买股票买入量可买0股,是什么原因? html标题元素怎么打 高一化学怎么学好_ 高一化学学习好方法 高一化学怎么学_高中化学学习重点 高一化学学习方法指导 2008年8月钢材价钱 黄豆半生不熟吃了有毒吗? 汽车l粘贴手机支架用什么胶水好? 煮黄豆,豆子没熟但水开了,我喝了这个水会中毒吗? 用没煮熟的豆子只用热水去榨豆浆 我喝了会怎么样 千足金和万足金颜色不一样吗 黄金。。。千足金和万足金是什么意思。怎么辨认黄金