C ++ / CLI управляемая оболочка вокруг статической библиотеки C - PullRequest
1 голос
/ 10 февраля 2011

Помощь!

Я полностью измотан / разочарован тем, что кажется довольно простой задачей. Я не уверен, что я делаю неправильно; не говоря уже о том, если я делаю это правильно. Мне «необходимо» использовать существующую библиотеку (статическая библиотека C - более 100 000 строк прямого кода C) при разработке приложения WPF (VS 2010, C # 4.0). О, и я не могу прикоснуться к существующему коду C - используй его как есть!

Я прочитал так много сообщений (сложные темы, инструкции и т. Д.), Но я настолько новичок в C ++ / CLI, что это просто не имеет смысла. Из того, что я прочитал, лучший подход - обернуть статическую библиотеку C следующим образом:

Статическая библиотека неуправляемого C <---> DLL-библиотека управляемой оболочки C ++ / CLI <---> управляемое приложение WPF

Это сокращенный заголовочный файл C:

/* Call this function to execute a command. */
int issue_command(int command, long param1, long param2);

/* Completion call back function; you must supply a definition. */
extern  int command_completed(int command, long param1, long param2);

struct struct_command_str
{
      char   command_str[10];
      char   param1_st[2];
      char   param2_st[2];
      char   success;
};

/* You must supply definitions to the following extern items. */
extern  int command_status;
extern struct struct_command_str  command_str;

Проблема (ы):

Что я не могу сделать правильно, так это предоставить реализацию C ++ / CLI для функций обратного вызова и два внешних элемента (command_status и struct command_str).

Может ли кто-нибудь предоставить пример реализации C ++ / CLI для вышеуказанных отсутствующих функций обратного вызова и внешних элементов?

Заранее благодарим за помощь.

Ответы [ 2 ]

3 голосов
/ 10 февраля 2011

в вашем проекте управляемой оболочки C ++ / CLI, добавьте 2 файла:

.c файл:

extern void doSomething();

int command_status = 0;

struct_command_str command_str = { "command1", "p1", "p2", 't' };

int command_completed(int command, long param1, long param2) {
    ...
    command_status = 1;
    ...
    doSomething();
    ...
    command_status = 2;
    ...
    return 3;
}

файл cpp

void doSomethingManagedWrapper() {
    ...
    call managed code
    ...
}

void doSomething() {
    doSomethingManagedWrapper();
}
1 голос
/ 11 февраля 2011

когда вы реализуете их в своем модуле c ++ / cli, используйте ту же сигнатуру, которая показана в заголовочном файле c, но с префиксом extern "C".

также поместите блок extern "C" вокруг #include файла заголовка C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...