D中的C ++ DLL(纯虚函数)

Unglam Bas

通常,我用C ++创建DLL。对于这种情况,我正在尝试使用D。到目前为止,我的进步是我能够使诸如ZooInformation之类的结构正常工作。但是,我对包含纯虚拟功能的Zookeeper遇到了问题。我如何将其转换为D并能够像在C ++中一样调用Zookeeper的功能?

/* Zoo.h interface file */
struct ZooInformation

{
    char    organization[128];
    int     year;
};
struct Animal
{
    char    name[128];
    int     age;
};
struct ZooKeeper
{
    virtual int __stdcall GetID();
    virtual int __stdcall GetAge();
    virtual time_t __stdcall GetDOB();
    virtual void __stdcall GetAnimal(Animal *a);
    virtual int _stdcall AddAnimal(const Animal *a);
};
/* hooks*/
void APIENTRY InitializeZoo(ZooInformation *zi);
int APIENTRY StartZoo(ZooKeeper *zk);
void APIENTRY ZooStarted();

/* C++ way of implementing Zoo.h */
/* you don't call the hooks directly */
/* the hooks are triggered and you do your logic accordingly */

; ZooDLL.def
LIBRARY ZooDLL
    EXPORTS
        InitializeZoo
        StartZoo
        ZooStarted


/* ZooDLL.cpp */
#include "Zoo.h"

ZooKeeper *zk_ = NULL;

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch(ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
void InitializeZoo(ZooInformation *zi)
{
    /* i have to fill ZooInformation myself */
    if(zi != NULL)
    {
        ZooInformation zi_ = { "StackOverflow Zoo", 2013 };
        memcpy(zi, &zi_, sizeof(ZooInformation));
    }
}
int APIENTRY StartZoo(ZooKeeper *zk)
{
    /* we do not need to initialize ZooKeeper ourself */
    /* it is returned by StartZoo */

    if(zk != NULL)
    {
        zk_ = zk;
        return TRUE;
    }
    return FALSE;
}
void APIENTRY ZooStarted()
{
    cout << "ID: " << zk_.GetID() << endl;
    cout << "Age: " << zk_.GetAge() << endl;
}

/* D way of implementing Zoo.h */
/* template code generated by D when creating a DLL project */
/* dllmain.d */

; dll.def
; linker definition file
;
; when creating DLLs a definition file should always be specified because of
;  http://d.puremagic.com/issues/show_bug.cgi?id=8130

EXETYPE      NT
LIBRARY      "DynamicLib.dll"
CODE         PRELOAD DISCARDABLE
DATA         PRELOAD MULTIPLE

; there's also bug http://d.puremagic.com/issues/show_bug.cgi?id=3956 causing 
; inconsistent naming for symbols with "export" specifier
; The workaround is to list the names in the EXPORT section translating the name to itself:
; EXPORTS
;    Symbol Symbol

EXPORTS
    InitializeZoo
    StartZoo
    ZooStarted

module dllmain;

import std.c.windows.windows;
import core.sys.windows.dll;
import std.stdio;

extern (C++)
struct ZooInformation
{
    char[128]   organization;
    int         year;
}

extern (C++)
interface ZooKeeper
{
    extern (Windows) int GetID();
    extern (Windows) int GetAge();
}


_gshared HINSTANCE g_hInst;
_gshared ZooKeeper zk_;

extern (Windows)
BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
{
    final switch (ulReason)
    {
    case DLL_PROCESS_ATTACH:
        g_hInst = hInstance;
        dll_process_attach( hInstance, true );
        break;

    case DLL_PROCESS_DETACH:
        dll_process_detach( hInstance, true );
        break;

    case DLL_THREAD_ATTACH:
        dll_thread_attach( true, true );
        break;

    case DLL_THREAD_DETACH:
        dll_thread_detach( true, true );
        break;
    }
    return true;
}


extern (Windows)
void InitializeZoo(ZooInformation *zi)
{
    zi.year = 2013;
}

extern (Windows)
int StartZoo(ZooKeeper zk)
{
    if(zk != null)
    {
        zk_ = zk;
        return 1;
    }
    return 0;
}

extern (Windows)
void ZooStarted()
{
    writeln("ID: " + zk_.GetID());
    writeln("Age: " + zk_.GetAge());
}
弗拉基米尔·潘捷列夫

请参阅D网站上的此页面,尤其是“从D调用C ++虚拟函数”部分:与C ++的接口

与纯虚拟功能的接口应与其他虚拟功能相同。如果您遇到特定问题,请提供更多详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

D中的C ++ DLL(纯虚函数)

来自分类Dev

在Singleton DLL中未定义的纯虚函数

来自分类Dev

在Singleton DLL中未定义的纯虚函数

来自分类Dev

C ++ 11中的纯虚函数

来自分类Dev

C ++纯虚函数调用的性能差异

来自分类Dev

奇怪的行为C ++纯虚函数

来自分类Dev

奇怪的行为C ++纯虚函数

来自分类Dev

关于纯虚函数的C ++设计原理?

来自分类Dev

C ++标准库中是否有纯虚函数?

来自分类Dev

在过载解析中是否真的选择了纯虚函数?

来自分类Dev

具有实现的纯虚函数在XCode中失败

来自分类Dev

const限定词从纯虚函数中消失

来自分类Dev

使用纯虚函数定义在C ++类之外?

来自分类Dev

C ++ 11线程,错误调用了纯虚函数

来自分类Dev

C ++ 11构造函数继承和纯虚方法

来自分类Dev

C ++将基本类型传递给纯虚函数

来自分类Dev

C ++:通过调用纯虚函数避免重复

来自分类Dev

使用纯虚函数在C ++类之外定义?

来自分类Dev

具有纯虚函数的模板类的C ++语法?

来自分类Dev

将主体添加到C ++中的纯虚/抽象函数中?

来自分类Dev

C++11 中默认纯虚析构函数的正确放置

来自分类Dev

为什么在构造函数内部的子元素中调用纯虚函数不起作用?

来自分类Dev

C ++:从同一类的成员函数调用纯虚函数

来自分类Dev

C ++用纯虚方法重写纯虚方法

来自分类Dev

使用b2FixtureDef的box2d CreateFixture提供了纯虚函数调用

来自分类Dev

是否可以使用CRTP在静态多态中模拟纯虚函数?

来自分类Dev

使用纯虚函数在boost python中的多个派生类

来自分类Dev

在派生类对象作为参数的基类中声明纯虚函数

来自分类Dev

.cpp文件中纯虚函数的正确返回值应该是什么?

Related 相关文章

热门标签

归档