#ifndef _DLL_H
#define _DLL_H#define DLLEXPORTS __declspec(dllexport) class DLLEXPORTS Dllclass
{
public:
    void func1(void);
    void func2(void);};
#endif;
delphi怎样引用这个类, 如果类的成员函数是虚函数

解决方案 »

  1.   

    描述有些错误应是DLL引出的C++类  在delphi中能定义并使用这个C++类吗55个经典开源Windows工具 http://soft.zol.com.cn/21/217313.html
      

  2.   

    这应该是MFC的DLL吧,Delphi应该是不行的吧,不过好象可以通过Obj文件来使用,具体看看Delhpi开发人员指南,不大清楚。真正的方法是使用COM
      

  3.   

    可以有限度地引出c++的类。只要你定义一个delphi中的相应纯虚类,然后将dll中引出的数据结构强制转换成这个类就能访问了。毕竟delphi中的类VMT是兼容c++的。可以通过这个方法访问引出类中的虚函数。所谓限制也就是只能引出这个类里面的虚函数(只有虚函数才会在VMT表中存在),不能引出静态函数。
      

  4.   

    类是我自己定义的,我也知道最好用COM可以通过Obj文件来使用 真的吗
      

  5.   

    印象中好象也是说不行的!
    有些东西强求不来的~~~~~~~********************************************************************
    *TryMyBestToKnowSomethingAboutEverythingAndEverythingAboutSomething! 
    ********************************************************************
      

  6.   

    将你需要暴露出来的成员函数单独放在一个接口类中,并让你的那个类实现那个接口,在Delphi中也使用同样定义的接口,就可以互相访问了。
      

  7.   

    给个例子:
    // {0505DD1E-63A9-4c74-BFEE-3EF34088B4E3}
    static const IID IID_IDllClass = 
    { 0x505dd1e, 0x63a9, 0x4c74, { 0xbf, 0xee, 0x3e, 0xf3, 0x40, 0x88, 0xb4, 0xe3 } };interface IDllClass:public IUnknown
    {
    STDMETHOD(func1) (THIS_) PURE;
    STDMETHOD(func2) (THIS_) PURE;
    };
    class Dllclass:public IDllClass
    {
    private:
    DWORD m_RefCount;
    public:
    //Constructor
    Dllclass():m_RefCount(0){}
    //IDllClass methods
    STDMETHODIMP func1(void);
    STDMETHODIMP func2(void);
    //IUnknown Methods
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();
    STDMETHODIMP QueryInterface(REFIID riid,void** ppvObject);
    };STDMETHODIMP_(ULONG) Dllclass::AddRef()
    {
    return ++m_RefCount;
    }
    STDMETHODIMP_(ULONG) Dllclass::Release()
    {
    DWORD dwRefCount=--m_RefCount;
    if(!m_RefCount)
    delete this;
    return dwRefCount;}
    STDMETHODIMP Dllclass::QueryInterface(REFIID riid,void** ppvObject)
    {
    HRESULT hRet=E_NOINTERFACE;
    LPVOID pvObject=NULL;
    if(riid==IID_IUnknown)
    {
    pvObject=reinterpret_cast<IUnknown*>(this);
    }
    if(riid==IID_IDllClass)
    {
    pvObject=reinterpret_cast<IUnknown*>(this);
    }
    if(pvObject)
    hRet=S_OK;
    *ppvObject=pvObject;
    return hRet;
    }
    STDMETHODIMP Dllclass::func1(void)
    {
    return S_OK;
    };
    STDMETHODIMP Dllclass::func2(void)
    {
    return S_OK;
    };在Delphi中的定义:
        IDllClass=interface
          ['{0505DD1E-63A9-4c74-BFEE-3EF34088B4E3}']
          function func1:HRESULT;
          function func2:HRESULT;
        end;
    然后你通过导出函数将这个类的接口实例传递给Delphi的程序,就可以在Delphi中使用了。
      

  8.   

    要是觉得在C++中实现COM接口比较麻烦,又不想花时间学MFC在COM的实现,可以用这篇blog中的宏来简化定义http://www.blogcn.com/user53/lexchou/blog/23560633.html
      

  9.   

    使用OBJ文件中的C++类 其C++类不能是继承类
    使用DLL引出的C++类也有同样的要求Delphi 7中依然如此吗????
      

  10.   

    如果是使用C++Builder,可在dll中新增一个单位文件,在该单元文件中定义一个接口,该接口实现需要导出的C++类的所有方法、属性,并创建一个类厂函数,该函数必须导出。然后编译该该单元生成dcu文件。
    在主控程序中引用定义接口的单元dcu文件,利用导出的全局类厂函数创建一个对象并用接口即可操作你的导出类了。
    缺点是你创建的类实例是通过类厂生成在dll的内存空间而不能在主控程序中生成类实例