2010-11-02 2 views
3

У меня есть этот C++ код, который показывает, как расширить программное обеспечение путем компиляции его в DLL и положить его в папку приложения:Использование Cython для предоставления функциональных возможностей к другому приложению

#include <windows.h> 

#include <DemoPlugin.h> 

/** A helper function to convert a char array into a 
    LPBYTE array. */ 
LPBYTE message(const char* message, long* pLen) 
{ 
    size_t length = strlen(message); 
    LPBYTE mem = (LPBYTE) GlobalAlloc(GPTR, length + 1); 
    for (unsigned int i = 0; i < length; i++) 
    { 
    mem[i] = message[i]; 
    } 
    *pLen = length + 1; 
    return mem; 
} 

long __stdcall Execute(char* pMethodName, char* pParams, 
    char** ppBuffer, long* pBuffSize, long* pBuffType) 
{ 
    *pBuffType = 1; 

    if (strcmp(pMethodName, "") == 0) 
    { 
    *ppBuffer = (char*) message("Hello, World!", 
    pBuffSize); 
    } 
    else if (strcmp(pMethodName, "Count") == 0) 
    { 
    char buffer[1024]; 
    int length = strlen(pParams); 
    *ppBuffer = (char*) message(itoa(length, buffer, 10), 
    pBuffSize); 
    } 
    else 
    { 
    *ppBuffer = (char*) message("Incorrect usage.", 
    pBuffSize); 
    } 

    return 0; 
} 

ли можно сделать плагин таким образом, используя Cython? Или даже py2exe? DLL просто должна иметь точку входа, не так ли?

Или мне нужно просто скомпилировать его изначально и вставить Python с помощью elmer?

ответ

3

Я думаю, что решение заключается в использовании обоих. Позволь мне объяснить.

Cython делает удобным создание быстрого плагина с использованием python, но неудобно (если вообще возможно) сделать правильный «вид» DLL. Вам, вероятно, придется использовать автономный режим, чтобы включить исполняемую среду python, а затем испортить сгенерированный код c, чтобы соответствующая DLL была скомпилирована.

И наоборот, эльмер делает удобным создание библиотеки DLL, но использует «чистый» код на языке питона, который может быть недостаточно быстрым. Я предполагаю, что скорость - это проблема, потому что вы рассматриваете cython, а не простое вложение.

Мое предложение состоит в следующем: чистый код python, который выполняет elmer, должен импортировать стандартное расширение python cython и выполнить код из него. Таким образом, вам не нужно взломать что-нибудь уродливое, и у вас есть лучшее из обоих миров.


Еще одно решение рассмотреть использует shedskin, потому что, как вы можете получить C++ код из питона кода, который не зависит от питона выполнения.

Смежные вопросы