3

ソフトウェアを DLL にコンパイルしてアプリケーション フォルダーに配置することで、ソフトウェアを拡張する方法を示す次の C++ コードがあります。

#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 にはエントリ ポイントが必要です。

それとも、ネイティブにコンパイルして、elmerを使用して Python を埋め込む必要がありますか?

4

1 に答える 1

3

解決策は両方を使用することだと思います。説明させてください。

Cython は、Python を使用して高速なプラグインを作成するのに便利ですが、適切な「種類」の DLL を作成するのは (可能な場合でも) 不便です。必要な python ランタイムが含まれるようにスタンドアロン モードを使用し、生成された c コードをいじって適切な DLL がコンパイルされるようにする必要があります。

逆に、elmer は DLL を作成するのに便利ですが、「純粋な」python コードを実行するため、十分に高速ではない可能性があります。単純な埋め込みではなく cython を検討しているため、速度が問題になると思います。

私の提案は次のとおりです。elmer が実行する純粋な python コードは、標準の cython python 拡張機能をインポートして、そこからコードを実行する必要があります。このようにして、醜いものをハックする必要はなく、両方の長所を活用できます。


考慮すべきもう 1 つの解決策は、shedskinを使用することです。これにより、Python ランタイムから独立した Python コードから C++ コードを取得できるためです。

于 2010-11-03T06:56:23.590 に答える