精华内容
下载资源
问答
  • vb 生成dll ,vbs 调用dll

    千次阅读 2013-04-16 10:38:41
    1.新建工程ActiveX.dll. 2.从命名工程名和类名,...4.打开VBS 定义该DLL对象. "Set test = CreateObject("test.class")"(test是工程名,class是类名) 5.用对象点方法就可以了.   例VB里输入代码: Public Function

    1.新建工程ActiveX.dll.

    2.从命名工程名和类名,并编写类方法,后保存成DLL

    3.用regsvr32 + DLL的全路径.(注册)

    4.打开VBS 定义该DLL对象.

    "Set test = CreateObject("test.class")"(test是工程名,class是类名)

    5.用对象点方法就可以了.

     

    例VB里输入代码:

    Public Function getData() As String
    Dim head As Long
    Dim short As Integer
    Open "c:\relate.hk" For Binary As #1
    Get #1, , head
    'Do While Not EOF(1)
        Get #1, , short
        usSerial = usSerial & " " & short
        Get #1, , short
        usCount = usCount & " " & short
        toSerial = toSerial & " "
        For i = 1 To 500
            Get #1, , short
            toSerial = toSerial & "," & short
        Next i
    'Loop
    Close #1
    usSerial = Replace(Trim(usSerial), " ", "|")
    usCount = Replace(Trim(usCount), " ", "|")
    toSerial = Replace(Trim(toSerial), " ", "|")
    getData = usSerial & "~" & usCount & "~" & toSerial
    End Function

     

    保存为DLL,工程名为:test,类名为class

     

    注册后,vbs调用:

    Dim test
    Set test = CreateObject("test.class")
    'getstr=Split(test.getData,"~")
    Debug.WriteLine test.getData

    展开全文
  • VBS调用c#编译DLL

    2019-11-28 11:41:24
    因为工作需要用到VBS调用dll,网上贴子看了不少,教程不全,成功率低, 于是我研究了几天,本教程亲测可用 1.新建c#类库,这个不多说了 代码如下 using System; using System.Collections.Generic; using System....

    VBS调用c#编译dll

    因为工作需要用到VBS调用dll,网上贴子看了不少,教程不全,成功率低,
    于是我研究了几天,本教程亲测可用
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191128112428856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTEyNTc3NQ==,size_16,color_FFFFFF,t_70
    1.新建c#类库,这个不多说了

    代码如下

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Runtime.InteropServices;

    namespace TestCom
    {

    [ComVisible(true)]
    [Guid("6D7D9956-CB6B-4EF1-BFF2-2ABD0D04CA22")]
    public interface iClass1
    {
    
        int test(int num1,int num2,string str);
    
    }
    
    
    
    [ComVisible(true)]
    
    [ClassInterface(ClassInterfaceType.AutoDual)]     
    //[ClassInterface(ClassInterfaceType.AutoDual)]
    
    public class Class1 : iClass1
    {
        public string test1()
        {
    
            return "ok";
    
        }  
        public int test(int num1, int num2,string str)
        {
            int result = 0;
            switch(str)
            {
                case "x":
                    result = num1* num2;
                    break;
                case "+":
                    result = num1 + num2;
                    break;
                case "-":
                    result = num1 - num2;
                    break;
                case "/":
                    result = num1 / num2;
                    break;
            }
            return result;
    
        }
    
    
    }
    

    }
    2.3.添加强名
    选择开始菜单中Vistual Studio目录下的Vistual Studio Tools下的Vistual Studio 命令提示。使用sn -k c:\myKey.snk生成签名文件

    3.在项目上右键,点击属性,选择签名,选中为程序集签名,选择myKey.snk文件
    在这里插入图片描述
    使程序集Com可见打勾
    在这里插入图片描述
    为Com互操作注册勾上
    在这里插入图片描述
    在这里插入图片描述
    这就我之前一直不成功原因,不选或者默认Any CPU就会报这种错
    在这里插入图片描述
    最后生成dll文件,c#就完成了

    VBS
    在这里插入图片描述
    试验一下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    OK,成功了

    展开全文
  • 程序编写后从通达信调用就比较简单了,将编译无误的DLL从DEBUG目录复制到通达信T...然后重新登录通达信软件在公式编辑器中调用DLL中的函数。例如调用代码:DLLEMA:TDXDLL3(3,C,60,0);TDXDLL后面的3意思是调用绑定...

    程序编写后从通达信调用就比较简单了,将编译无误的DLL从DEBUG目录复制到通达信T0002目录下的DLLS目录里。

    15b036c1b76c9e757d480eaff88b07d4.png
    a3041444239d8bb0253f5226daa0d77c.png

    然后在公式管理器中通过DLL函数按钮进行绑定,如果绑定失败,可以直接在DLLS目录的配置文件DLLS这个文本文件中将绑定添加进去。

    99077a7b439b52965152849cb6a36531.png
    733dca9c2887aaf36883a7e46a8e46e2.png

    然后重新登录通达信软件在公式编辑器中调用DLL中的函数。例如调用代码:

    DLLEMA:TDXDLL3(3,C,60,0);TDXDLL后面的3意思是调用绑定的第3个DLL,括号里的第一个3意思是调用绑定的DLL里的第3个函数,后面三个是输入参数收盘价C和天数60,求60天的EMA,计算结果与调用函数EMA(C,60)完全一样。QUE:TDXDLL3(4,H,0,L);找缺口,调整绑定的DLL里的第4个函数,输入参数为最高价和最低价,不需要传入的输入参数写0零,当有缺口时TDXDLL3(4,H,0,L)的返回值是1,没有缺口时返回值是零,经过多个股票缺口检验,返回结果正确。这样如何编写调用DLL写完了,有什么问题欢迎留言评论。

    05ea0ee28c8d6bb3d72bc4181970afc7.png
    展开全文
  • vbs调用win32 api,使VBS如虎添翼。压缩文件里有2个vbs示例,简单易懂,dll文件需要注册,请百度 CopyFileA.vbs MessageBox.vbs
  • Froser:COM编程攻略(七 COM跨进程组件开发实战)​zhuanlan.zhihu.com这一篇,我们将对这个本地进程服务做一些修改,让它能支持如下VBS脚本的调用:Set MessageApp = CreateObject("Message.App") MessageApp.Show...

    上一篇我们实现了一个本地进程服务。

    Froser:COM编程攻略(七 COM跨进程组件开发实战)zhuanlan.zhihu.com

    这一篇,我们将对这个本地进程服务做一些修改,让它能支持如下VBS脚本的调用:

    Set MessageApp = CreateObject("Message.App")
    MessageApp.Show("Hello World")

    如果没有看上一篇的小伙伴,强烈建议看一看。

    1. 获取Class ID的另外一种方式

    之前的文章说到,类对象是用来创建接口实例的。每一个类对象都有一个Class id,当客户调用CoCreateInstance时,需要传入这个class id,于是,COM SCM从注册表HKCRCLSID中,找到对应的Class id,并取出需要打开的服务的路径:

    cbfaab458615f5a2affe4a3d94437e12.png

    然而,这么长一串CLSID非常难记。如果能有一个字符串名字来代替这个这个GUID就好了。

    COM提供了2个API,通过ProgID或CLSID来进行相互查询:

    CLSIDFromProgIDdocs.microsoft.comProgIDFromCLSID function (combaseapi.h) - Win32 appsdocs.microsoft.com
    dc74370936b33f3bfed32676c8f8f89f.png

    对于ProgIDFromCLSID,我们只需要向上面截图那样,在{CLSID}下面添加一个ProgID键,写上它对应的程序名就可以了。

    对于CLSIDFromProgID,我们需要在HKCR下面添加一个{ProgID}的键,再在下面添加一个CLSID键,默认值为程序的class id:

    952fa71c5063e25233047bc5ecc4fc4f.png

    在上面的截图中,我们的ALTProject2的ProgID叫做Message.App,class id为{3A68BEBC-3A60-46A5-8CA1-508C1406B73D}。

    因此,我们稍微改一下rgs文件:

    HKCR
    {
        NoRemove CLSID
        {
            NoRemove {3A68BEBC-3A60-46A5-8CA1-508C1406B73D} = s 'Message.App'
            {
                ProgID = s 'Message.App'
                LocalServer32 = s '%MODULE%'
            }
        }
        Message.App = s 'MessageApplication'
        {
            CLSID = s '{3A68BEBC-3A60-46A5-8CA1-508C1406B73D}'
        }
    }

    这样,我们便把它的信息加入了注册表。我们可以通过下面的方式来创建对象:

    CComPtr<IUnknown> cpMessage;
    CLSID clsid;
    hr = CLSIDFromProgID(L"Message.App", &clsid);
    if (SUCCEEDED(hr))
    	hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&cpMessage);
    

    不用使用CLSID_Message,使得我们的客户代码不需要依赖服务端所提供的头文件。

    2. oleautomation (OLE自动化)

    ATL模板为我们生成了ATLProject2PS (ProxyStub)工程来进行进程外的通讯。如果我们所有的接口都是VARIANT类型或者IUnknown类型,那么可以在idl文件[object, uuid(....)]里面加上oleautomation,那么它会使用COM默认的ProxyStub,而不需要手动注册ATLProject2PS.dll

    [object, uuid(28F54187-9D26-46DE-9809-4CADCB1F84D7), oleautomation]

    3. Type Library (tlb)

    MIDL在生成各种.c的文件的同时,也会生成一个tlb文件。tlb文件将接口符号化(可以认为是建立反射关系),供COM可感知的环境(如VB)使用。通过Type Library,可以实现反射功能,也可以拿出这个Library的诸多信息。

    在ATL中,注册服务时,ATL会走到AtlRegisterTypeLib中:

    ATLINLINE ATLAPIINL AtlRegisterTypeLib(
    	_In_ HINSTANCE hInstTypeLib,
    	_In_opt_z_ LPCOLESTR lpszIndex)
    {
    	CComBSTR bstrPath;
    	CComPtr<ITypeLib> pTypeLib;
    	HRESULT hr = AtlLoadTypeLib(hInstTypeLib, lpszIndex, &bstrPath, &pTypeLib);
    	if (SUCCEEDED(hr))
    	{
    		...
    		if( NULL == pfnRegisterTypeLib )
    		{
    			pfnRegisterTypeLib = (PFNREGISTERTYPELIB)&RegisterTypeLib;
    		}
    
    		hr = pfnRegisterTypeLib(pTypeLib, bstrPath, szDir);
    
    	}
    	return hr;
    }
    

    通过AtlLoadTypeLib,调用COM核心API LoadTypeLib,读取当前模块的信息,并生产一个ITypeLib实例。

    https://docs.microsoft.com/en-us/windows/win32/api/oleauto/nf-oleauto-loadtypelibdocs.microsoft.com

    然后,再调用RegisterTypeLib,将Type Library写入注册表:

    RegisterTypeLib function (oleauto.h) - Win32 appsdocs.microsoft.com
    dc74370936b33f3bfed32676c8f8f89f.png

    这个机制是动态调用的基本原理。

    关于类型库的详细知识,请查看:

    Froser:COM编程攻略(十七 类型库与类型信息)zhuanlan.zhihu.com

    4. IDispatch接口

    所有的动态调用,如最开始的VBS脚本,都会尝试来取IDispatch接口。

    IDispatch接口如下所示:

    interface IDispatch : public IUnknown
        {
        public:
            virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( 
                /* [out] */ __RPC__out UINT *pctinfo) = 0;
            
            virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( 
                /* [in] */ UINT iTInfo,
                /* [in] */ LCID lcid,
                /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo) = 0;
            
            virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( 
                /* [in] */ __RPC__in REFIID riid,
                /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,
                /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,
                /* [in] */ LCID lcid,
                /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId) = 0;
            
            virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( 
                /* [annotation][in] */ 
                _In_  DISPID dispIdMember,
                /* [annotation][in] */ 
                _In_  REFIID riid,
                /* [annotation][in] */ 
                _In_  LCID lcid,
                /* [annotation][in] */ 
                _In_  WORD wFlags,
                /* [annotation][out][in] */ 
                _In_  DISPPARAMS *pDispParams,
                /* [annotation][out] */ 
                _Out_opt_  VARIANT *pVarResult,
                /* [annotation][out] */ 
                _Out_opt_  EXCEPINFO *pExcepInfo,
                /* [annotation][out] */ 
                _Out_opt_  UINT *puArgErr) = 0;
            
        };
    

    其中:GetTypeInfoCount返回有多少个TypeInfo。GetTypeInfo则是根据用户传入的位置ID(lcid)来获取Type info接口实例。GetIDsOfNames,是通过名称,如VBA中的"Show",来获取一个我们在idl中定义的派发ID (dispid)。Invoke是指当这个方法被调用时,要执行的动作。用dispIdMember来区分我们调用了哪个方法。

    用现在的话来说,IDispatch就是动态反射需要的接口。实现者需要针对每个dispIdMember来做对应的处理,这看上去十分麻烦。

    不过,微软提供了一种技术,叫做dual interface。它可以绑定实现者IDispatch的虚表,自动匹配dispid和虚表函数地址之间的关系:

    Dual Interfaces (COM) - Win32 appsdocs.microsoft.com
    dc74370936b33f3bfed32676c8f8f89f.png

    为了实现一个派发类,我们只需要让它继承IDispatch,并且在idl中加上dual属性和oleautomation属性即可。那么我们修改一下idl,如下所示:

    import "oaidl.idl";
    import "ocidl.idl";
    
    [object, dual, uuid(28F54187-9D26-46DE-9809-4CADCB1F84D7), oleautomation]
    interface IDMessage : IDispatch
    {
    	[id(1)] HRESULT Show([in]VARIANT szText);
    };
    
    [
    	uuid(4a02363c-cbc1-403a-905e-8ae116ccd454),
    	version(1.0),
    ]
    library ATLProject2Lib
    {
    	importlib("stdole2.tlb");
    
    	[uuid(3A68BEBC-3A60-46A5-8CA1-508C1406B73D)]
    	coclass Message
    	{
    		interface IDMessage;
    	};
    };

    我们把IMessage改名成了IDMessage,表示这是一个IDispatch,对应的coclass里面的interface也变成了IDMessage。IDMessage里面仍然是一个Show方法,不过我们在前面加上了id(1),表示这个方法的dispid是1。

    ATL中实现了IDispatch的4个方法,使得我们只需要集中精力处理好Show的实现就可以了。那么,我们稍微改一下MessageBox.h:

    //.h
    #pragma once
    #include "ATLProject2_i.h"
    #include <atlcom.h>
    
    using namespace ATL;
    
    class DMessageImpl
    	: public CComObjectRoot
    	, public IDispatchImpl<IDMessage, &IID_IDMessage, &LIBID_ATLProject2Lib>
    {
    public:
    	BEGIN_COM_MAP(DMessageImpl)
    		COM_INTERFACE_ENTRY(IDMessage)
    		COM_INTERFACE_ENTRY(IDispatch)
    	END_COM_MAP()
    
    	STDMETHODIMP Show(VARIANT szText) override;
    };
    
    class Message
    	: public CComObjectRoot
    	, public CComCoClass<DMessageImpl, &CLSID_Message>
    {
    public:
    	DECLARE_REGISTRY_RESOURCEID(IDR_ATLPROJECT2);
    };
    
    OBJECT_ENTRY_AUTO(CLSID_Message, Message);
    
    // .cpp
    #include "pch.h"
    #include "MessageBox.h"
    
    STDMETHODIMP DMessageImpl::Show(VARIANT szText)
    {
    	MessageBoxW(NULL, szText.bstrVal, L"From Remote", MB_OK);
    	return S_OK;
    }
    

    cpp文件除了改了一下类名外,其他的和上一篇的版本毫无变化。头文件中,COM MAP增加了几个类型IDMessage和IDispatch,此外,它还继承了IDispatchImpl,里面实现了IDispatch默认的4个方法。

    类对象Message几乎也没有改动,它生成一个DMessageImpl。

    5. VBS脚本调用流程

    编译好了上面的工程后,我们打开记事本,写入:

    Set MessageApp = CreateObject("Message.App")
    MessageApp.Show("Hello World")
    

    运行它,发现弹出了一个对话框:

    1f4c8ea5b15e857f6c764ec9667f26f9.png

    那么恭喜你,你成功实现了一个支持自动化(VB)的服务程序!

    那么,在VBS调用CreateObject后到底发生了什么呢?

    1) CreateObject之后,首先调用了CLSIDFromProgID,再调用CoCreateInstance,获得IDispatch接口

    等效于:

    CComPtr<IDispatch> cpDisp;
    hr = CLSIDFromProgID(L"Message.App", &clsid);
    if (SUCCEEDED(hr))
    	hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&cpDisp);
    

    CoCreateInstance又相当于CoGetClassObject + CreateInstance。

    如果类对象生成的实例不支持IDispatch接口,那么会报错类不支持 Automation 操作

    2) 运行Show时,VB脚本引擎调用IDispatch::GetIDsOfNames

    等效于:

    DISPID dispid;
    cpDisp->GetIDsOfNames(IID_NULL, L"Show", 1, 1033, &dispid);
    

    由于我是中文版系统,所以LCID为1033。

    ATL的实现中,这个方法会调用GetTI来获取TypeLib,然后再从TypeLib取出TypeInfo:

    inline HRESULT CComTypeInfoHolder::GetTI(_In_ LCID lcid)
    {
    	//If this assert occurs then most likely didn't initialize properly
    	ATLASSUME(m_plibid != NULL && m_pguid != NULL);
    
    	if (m_pInfo != NULL && m_pMap != NULL)
    		return S_OK;
    ...
    	if (m_pInfo == NULL)
    	{
    		ITypeLib* pTypeLib = NULL;
    		if (InlineIsEqualGUID(CAtlModule::m_libid, *m_plibid) && m_wMajor == 0xFFFF && m_wMinor == 0xFFFF)
    		{
    			...
    				hRes = LoadTypeLib(pszFile, &pTypeLib);
    			...
    		}
    		else
    		{
    			...
    			hRes = LoadRegTypeLib(*m_plibid, m_wMajor, m_wMinor, lcid, &pTypeLib);
    			...
    		}
    		if (SUCCEEDED(hRes))
    		{
    			CComPtr<ITypeInfo> spTypeInfo;
    			hRes = pTypeLib->GetTypeInfoOfGuid(*m_pguid, &spTypeInfo);
    			if (SUCCEEDED(hRes))
    			{
    				CComPtr<ITypeInfo> spInfo(spTypeInfo);
    				CComPtr<ITypeInfo2> spTypeInfo2;
    				if (SUCCEEDED(spTypeInfo->QueryInterface(&spTypeInfo2)))
    					spInfo = spTypeInfo2;
    
    				m_pInfo = spInfo.Detach();
    				_pAtlModule->AddTermFunc(Cleanup, (DWORD_PTR)this);
    			}
    			pTypeLib->Release();
    		}
    	}
    	else
    	{
    		// Another thread has loaded the typeinfo so we're OK.
    		hRes = S_OK;
    	}
    
    	if (m_pInfo != NULL && m_pMap == NULL)
    	{
    		hRes=LoadNameCache(m_pInfo);
    	}
    
    	return hRes;
    }
    

    ITypeInfo可以认为拥有了IDispatch全部的反射信息,在ATL::LoadNameCache中,它把每一个方法取出来,放到了一个map中:

    _Check_return_ HRESULT LoadNameCache(_Inout_ ITypeInfo* pTypeInfo)
    {
    	TYPEATTR* pta;
    	HRESULT hr = pTypeInfo->GetTypeAttr(&pta);
    	if (SUCCEEDED(hr))
    	{
    		stringdispid* pMap = NULL;
    		m_nCount = pta->cFuncs;
    		m_pMap = NULL;
    		if (m_nCount != 0)
    		{
    			pMap = _ATL_NEW stringdispid[m_nCount];
    			if (pMap == NULL)
    			{
    				pTypeInfo->ReleaseTypeAttr(pta);
    				return E_OUTOFMEMORY;
    			}
    		}
    		for (int i=0; i<m_nCount; i++)
    		{
    			FUNCDESC* pfd;
    			if (SUCCEEDED(pTypeInfo->GetFuncDesc(i, &pfd)))
    			{
    				CComBSTR bstrName;
    				if (SUCCEEDED(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, NULL, NULL, NULL)))
    				{
    					pMap[i].bstr.Attach(bstrName.Detach());
    					pMap[i].nLen = SysStringLen(pMap[i].bstr);
    					pMap[i].id = pfd->memid;
    				}
    				pTypeInfo->ReleaseFuncDesc(pfd);
    			}
    		}
    		m_pMap = pMap;
    		pTypeInfo->ReleaseTypeAttr(pta);
    	}
    	return S_OK;
    }
    

    接下来调用从缓存好的Map中,或者ITypeInfo::GetIDsOfNames,通过反射返回结果。

    HRESULT GetIDsOfNames(
    	_In_ REFIID /* riid */,
    	_In_reads_(cNames) LPOLESTR* rgszNames,
    	_In_range_(0,16384) UINT cNames,
    	LCID lcid,
    	_Out_ DISPID* rgdispid)
    {
    	HRESULT hRes = EnsureTI(lcid);
    	_Analysis_assume_(m_pInfo != NULL || FAILED(hRes));
    	if (m_pInfo != NULL)
    	{
    		hRes = E_FAIL;
    		// Look in cache if
    		//	cache is populated
    		//	parameter names are not requested
    		if (m_pMap != NULL && cNames == 1)
    		{
    			int n = int( ocslen(rgszNames[0]) );
    			for (int j=m_nCount-1; j>=0; j--)
    			{
    				if ((n == m_pMap[j].nLen) &&
    					(memcmp(m_pMap[j].bstr, rgszNames[0], m_pMap[j].nLen * sizeof(OLECHAR)) == 0))
    				{
    					rgdispid[0] = m_pMap[j].id;
    					hRes = S_OK;
    					break;
    				}
    			}
    		}
    		// if cache is empty or name not in cache or parameter names are requested,
    		// delegate to ITypeInfo::GetIDsOfNames
    		if (FAILED(hRes))
    		{
    			hRes = m_pInfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
    		}
    	}
    	return hRes;
    }
    

    3) 将取出的dispid传入Invoke进行调用

    VB引擎负责组装好Invoke的每一个参数,ATL的实现显示检查TypeInfo是否存在,如果不存在则创建它,和上一步一样。然后将Invoke转发给TypeInfo。TypeInfo绑定虚表函数地址来进行直接调用,最终,DMessageBox::Show()被触发。

    _Check_return_ HRESULT Invoke(
    	_Inout_ IDispatch* p,
    	_In_ DISPID dispidMember,
    	_In_ REFIID /* riid */,
    	_In_ LCID lcid,
    	_In_ WORD wFlags,
    	_In_ DISPPARAMS* pdispparams,
    	_Out_opt_ VARIANT* pvarResult,
    	_Out_opt_ EXCEPINFO* pexcepinfo,
    	_Out_opt_ UINT* puArgErr)
    {
    	HRESULT hRes = EnsureTI(lcid);
    	_Analysis_assume_(m_pInfo != NULL || FAILED(hRes));
    	if (m_pInfo != NULL)
    		hRes = m_pInfo->Invoke(p, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
    	return hRes;
    }
    

    至此,我们已经搞清楚了VB调用COM的大致方式,IDispatch接口的含义和工作方式了。通过这个方法,我们可以实现很多自动化的程序,例如WPS, Word, Excel等,它们都是采取这样的方式来对VB、C#等语言进行支持的。希望能帮助大家加深理解。

    下一篇:

    Froser:COM编程攻略(九 COM设施之BSTR)zhuanlan.zhihu.com
    展开全文
  • 无法通过类对象偏移计算地址,除非用export导出,而gcc默认是全部导出实例函数,这也是为什么msvc需要.lib,如果你不清楚但希望了解,可以选择找我摆龙门阵),并以COM组件的c#直接调用(不需要引用生成introp.dll)...
  • Casey Smith@subTee在博客分享的一个技巧,使用wmic能够从本地或从URL调用XSL(可扩展样式表语言)脚本。这个发现很有用,不仅可以作为一种白名单绕过的方法,而且可以作为payload来使用(从URL调用XSL脚本,利用XSL...
  • 1,动态调用dll(主要用于API等的测试):不必事先在主程序中声明dll中的函数并编译,程序实时动态调用。 2,动态调用VBS脚本及VBS编辑:动态调用VBS(VBScript)脚本,灵活方便;格式化VBS编辑功能,美观实用。
  • VBScript在调用VB编译的DLL里的一个方法时,总是报错“无效的过程调用或参数”,而在VB中按同样方法调用时一点问题也没有,很是奇怪,VBS调用该类另一个方法却能成功,对比了两个方法,发现参数定义不同。...
  • WinCC对象属性的动态化也可以通过C动作或VBS动作来实现。用VBS动态化的属性,"小灯泡"变为带"VB"的闪电图标;用C脚本动态化的属性,"小灯泡"变为带"c"的闪电图标。下面试举一例:用C脚本实现一个五角星旋转,说明...
  • vbs调用ActiveX的DLL的方法

    千次阅读 2008-07-25 18:33:00
    dll注册后用OLE/COM 类查看器(VC有)查看 dim obj set obj=CreateObject( "工程名.类名 ") obj.函数 参数,参数…… 没返回值的不能加括号用返回值的用 变量=obj.函数(参数,参数……)
  • UserWrap.PostMessage hWnd,WM_KEYDOWN ,97,0 UserWrap.PostMessage hWnd,WM_KEYDOWN ,96,0 UserWrap.PostMessage hWnd,WM_KEYDOWN ,96,0 UserWrap.PostMessage hWnd,WM_KEYDOWN ,98,0 VBS调用windows api函数(post...
  • 这两天在搞一个项目,其中涉及到要用vbs调用dll,用vs写个dll,还不是太辣手,但是要用vbs 调用dll,确实还是有点头大,但还好,我们有google。。。。  先提下用vb.net 自己调用自己的dll方法:在解决方案资源管理...
  • vbs显示窗体(显示控件,调用标准DLL还要大家再去扩展) 用一个方法可以直接让PY显示任意控件,VBS也可以做界面 VBS就可以当软件用了,支持API调用(Findwindow),支持加载控件,他本身就支持调用对象creatobject,那...
  • VBS调用mswinsck.ocx

    2016-12-09 11:35:44
    因为不是自带控件,所以先注册mswinsck.ocx 管理员运行CMD,代码 regsvr32 mswinsck.ocx2....ActiveX控件的License有两种:设计时(design-time)和运行时(run-time)。当编译调用了某个控件的exe/dll/oc
  • VBS 调用 Windows Win32 API

    千次阅读 2019-07-31 11:22:59
    首先下载通用库:win32exts for VBScript: ... 将win32exts_dll.dll 放入 搜索目录目录下注册即可。仅有此一个文件。 Regsvr32 /s win32exts_dll.dll ...win32exts调用的基本用法如下: 首先初始化对象...
  • 近来,做关于wincc的项目,用到将vbs脚本封装成DLL,并在vbs脚本里面调用,故而整理如下。 一、如何将vbs脚本封装DLL 1. 在VB6.0中新建ActiveX DLL工程。 2.命名
  • AutoItX(可用于vbs调用的控件)

    热门讨论 2009-05-28 16:05:41
    AutoItX is a DLL version of AutoIt v3 that provides a subset of the features of AutoIt via an ActiveX/COM and DLL interface. This means that you can add AutoIt-like features to your favourite ...
  • .net C#调用VBS脚本

    2017-07-04 11:55:09
    .net C# ,引用 Interop.MSScriptControl.dll调用VBS脚本 ,可直接运行。 内带 Interop.MSScriptControl.dll
  • vb 调用 VBS

    千次阅读 2013-05-05 21:17:29
    vb.net调用 vbsfile= chr(34)+ app.path+ "\GB.vbs"+chr(34) shell "wscript.exe " + vbsfile...关于vb6.0 调用/运行 VBS 几种方式: 一:Private Declare Function ShellExecute Lib "shell32.dll" Alias "She
  • Class Yongfa365Test   '==========声明变量==========...Public MyName 'Public型变量相当于属性,引用类后可以直接调用或设置值   '==========声明属性==========
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼一个java的项目中遇到一个问题。...写了一个测试的COM,用vbs调用成功。通过jacob调用时提示com.jacob.com.ComFailException: A COM exception has been ...
  • 前面已经讨论过利用VBS的CreateObject方法来干很多以前不...如果利用EXCEL作为突破口,VBS调用EXCEL的宏,而由EXCEL的宏来调用Windows API正可以很好的解决这一问题。 1.简单举例 在API.XLS的Sheet1中加入如下代码...
  • DynamicWrapperX 是一个ActiveX部件,它允许调用DLL库里面的函数,特别是API 的函数。可用于 Jscript和VBscript。它由汇编语言写成。短小精悍,才 13Kb,压缩后才5kb,比OpenDCL.arx甚至自己做的.dll文件都小很多,...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

vbs调用dll