首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C++ API转换为托管代码API

将C++ API转换为托管代码API
EN

Stack Overflow用户
提问于 2011-03-14 21:23:09
回答 2查看 266关注 0票数 3

我正在尝试将一个C++库包装在Objective-C类中,以便使用btouch导入到MonoTouch中。我正在尝试掌握如何将API转换为在托管环境中使用。具体地说,就是如何处理接受指向局部变量的指针的方法,如下面示例中的ULDatabaseManager::OpenConnection静态方法:

代码语言:javascript
复制
class UL_CLS_SPEC ULError {
    public:
    ULError();

    /* Gets the error code (SQLCODE) for the last operation. */
    inline an_sql_code GetSQLCode() const {
        return _info.sqlcode;
    }
}

class UL_CLS_SPEC ULDatabaseManager {
    public:
    /* Initializes the UltraLite runtime. */
    static bool Init();

    /* Finalizes the UltraLite runtime. */
    static void Fini();

    /* Opens a new connection to an existing database. */
    static ULConnection * OpenConnection(
        const char * connParms,
        ULError * error = UL_NULL);
}

在Objective-C中,此C++应用编程接口将按如下方式调用:

代码语言:javascript
复制
- (void)openConnection {
    if (ULDatabaseManager::Init()) {
        const char * connectionParms;
        ULConnection * conn = nil;
        ULError error;

        connectionParms = [self getConnectionParms];

        // Attempt connection to the database
        conn = ULDatabaseManager::OpenConnection(connectionParms, &error);

        // If database file not found, create it and create the schema
        if (error.GetSQLCode() == SQLE_ULTRALITE_DATABASE_NOT_FOUND) {       
            // Handle error
        }                
    }
}

在此API中,OpenConnection静态方法的调用者负责定义ULError变量并将其作为引用指针参数传入。这种范例似乎不能很好地转换为托管环境,或者至少在我看来,让调用者负责实例化ULError对象似乎是不正确的。将此API转换为Objective-C类的最佳实践是什么?哪个类负责创建和销毁ULError对象?

我希望我的问题是有意义的,因为我对C++和Objective-C (以及MonoTouch )非常陌生,所以我仍然不太了解我不知道的东西!:),目前我感觉有点不深入。因此,我非常感谢任何有助于解释如何包装C++应用程序接口的好文章的建议或参考。

PS:我知道这个问题主要与C++和Objective-C有关,但我将MonoTouch作为一个标签包括在内,以防有使用btouch导入Objective-C类的经验的人有一些建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-12 18:34:40

我解决这个问题的方法是通过btouch改变暴露给Monotouch的API。具体地说,像OpenConnection i这样的方法只需要connectionParms,而不需要指向error类的指针。然后,我在open方法中进行了错误检查,如果出现错误,则返回nil。在包装器类中,我还保留了一个ULError对象,我将其命名为lastConnectionError,并且我的C++代码通过OpenConnection C++调用传递了一个指向该对象的指针。我在包装器类GetLastConnectionError中包含了一个单独的方法,它返回一个表示不同可能的错误状态的枚举。

票数 0
EN

Stack Overflow用户

发布于 2011-03-21 23:14:03

我认为最好的解决方案是围绕C++类创建一个objective-c类。那么使用btouch绑定应该是非常简单的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5299138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档