dll写的不规范,可能用class包了一层,无法从dumpbin看到dll的函数入口。

解决方案 »

  1.   

    C++处的代码是主要内容,我不会C++所以不是很清楚。不过做这个DLL的人说这绝对是一个标准的COM。请各位大哥帮忙解决下!!想要DLL的话请提供邮箱。
      

  2.   

    附上COM源码:
    Ptr.cpp:// Ptr.cpp : DLL 导出的实现。#include "stdafx.h"
    #include "resource.h"
    #include "Ptr.h"class CPtrModule : public CAtlDllModuleT< CPtrModule >
    {
    public :
    DECLARE_LIBID(LIBID_PtrLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_PTR, "{F890D811-67EF-408A-BF64-727D1B963A86}")
    };CPtrModule _AtlModule;
    // DLL 入口点
    extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    hInstance;
        return _AtlModule.DllMain(dwReason, lpReserved); 
    }
    // 用于确定 DLL 是否可由 OLE 卸载
    STDAPI DllCanUnloadNow(void)
    {
        return _AtlModule.DllCanUnloadNow();
    }
    // 返回一个类工厂以创建所请求类型的对象
    STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
    {
        return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
    }
    // DllRegisterServer - 将项添加到系统注册表
    STDAPI DllRegisterServer(void)
    {
        // 注册对象、类型库和类型库中的所有接口
        HRESULT hr = _AtlModule.DllRegisterServer();
    return hr;
    }
    // DllUnregisterServer - 将项从系统注册表中移除
    STDAPI DllUnregisterServer(void)
    {
    HRESULT hr = _AtlModule.DllUnregisterServer();
    return hr;
    }
      

  3.   

    PtrFun.cpp:#include "stdafx.h"
    #include "PtrFun.h"
    #include ".\ptrfun.h"
    // CPtrFun
    typedef BOOL ( * pFun) (DWORD MsgID, LONG Param);
    pFun  mptrFun;
    STDMETHODIMP CPtrFun::InterfaceSupportsErrorInfo(REFIID riid)
    {
    static const IID* arr[] = 
    {
    &IID_IPtrFun
    }; for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
    if (InlineIsEqualGUID(*arr[i],riid))
    return S_OK;
    }
    return S_FALSE;
    }STDMETHODIMP CPtrFun::GetFunPtr(CALLBACK * ptrFun)
    {
    // TODO: 在此添加实现代码
    mptrFun = (pFun)ptrFun;
    return S_OK;
    }STDMETHODIMP CPtrFun::Eventa(LONG Num[1], LONG TemVal[1])
    {
    // TODO: 在此添加实现代码
    long i,k;
    i=Num[0];
    k=TemVal[0];
        if(mptrFun) (* mptrFun)(i, k);
    return S_OK;
    }
      

  4.   

    PtrFun.h:// PtrFun.h : CPtrFun 的声明#pragma once
    #include "resource.h"       // 主符号#include "Ptr.h"
    // CPtrFunclass ATL_NO_VTABLE CPtrFun : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CPtrFun, &CLSID_PtrFun>,
    public ISupportErrorInfo,
    public IPtrFun
    {
    public:
    CPtrFun()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_PTRFUN)
    BEGIN_COM_MAP(CPtrFun)
    COM_INTERFACE_ENTRY(IPtrFun)
    COM_INTERFACE_ENTRY(ISupportErrorInfo)
    END_COM_MAP()// ISupportsErrorInfo
    STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
    {
    return S_OK;
    }

    void FinalRelease() 
    {
    }public: STDMETHOD(GetFunPtr)(CALLBACK * ptrFun);
    STDMETHOD(Eventa)(LONG Num[1], LONG TemVal[1]);
    };OBJECT_ENTRY_AUTO(__uuidof(PtrFun), CPtrFun)
      

  5.   

    to C++处的代码是主要内容,我不会C++所以不是很清楚。不过做这个DLL的人说这绝对是一个标准的COM。请各位大哥帮忙解决下!!想要DLL的话请提供邮箱。如果是标准com的话,就不能用dllimport来引入,
    用regsvr32注册此com,通过引入com的方式来进行调用。
      

  6.   

    TO:Knight94(愚翁) 我开始是用regsvr32注册。然后再引入COM。接着生成COM对象再调用方法。可是在调用GetFunPtr这个方法的时候它的参数变成了ref uint 类型的参数了。那怎么传委托呢??该怎么做?请赐教。谢谢!
      

  7.   

    你没告诉pFun是什么样的函数至于传递委托,可以用Marshal.GetFunctionPointerForDelegate得到IntPtr,然后转换成uint类型就行。
      

  8.   

    C#和COM的源码上面都有了。引用:   至于传递委托,可以用Marshal.GetFunctionPointerForDelegate得到IntPtr,然后转换成uint类型就行。不好意思,我是新手。请说详细点好吗?谢谢!
      

  9.   

    sample code as follows:CallBack ca = new CallBack(Form1.a);
    uint pCallBack =(uint)( Marshal.GetFunctionPointerForDelegate( ca ).ToInt32());
      

  10.   

    TO Knight94(愚翁):谢谢。转换成功,方法执行也成功,可是后面又出现个问题。在执行Eventa(m, n)的时候报错:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”我在调用其他COM的时候也报过这样的错。它们的共同点是含有数组参数。Eventa在C++的数组参数是LONG,而我在C#调用的时候。它显示的是int[] 类型。是不是要转换一下呢??