Domanda

Ho questo codice C ++ che mostra come estendere un software per compilarlo a una DLL e metterlo nella cartella dell'applicazione:

#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;
}

Is è possibile fare un plugin in questo modo utilizzando Cython? O anche py2exe? La DLL deve solo avere un punto di ingresso, giusto?

o devo solo compilarlo in modo nativo e incorporare Python utilizzando Elmer ?

È stato utile?

Soluzione

Credo che la soluzione è quella di utilizzare entrambi. Mi spiego.

Cython rende conveniente per fare un plugin veloce utilizzando python ma scomodo (se possibile) per rendere il giusto "tipo" di DLL. Probabilmente si dovrà utilizzare la modalità stand-alone in modo che il runtime di Python necessaria è incluso e poi pasticciare con il codice C generato in modo adeguato una DLL viene compilata.

Al contrario, Elmer rende conveniente per rendere la DLL, ma esegue il codice python "puro" che potrebbe non essere abbastanza veloce. Presumo velocità è un problema perché si stanno prendendo in considerazione Cython al contrario di semplice embedding.

Il mio suggerimento è questo: il codice python puro che viene eseguito Elmer dovrebbero importare un'estensione Cython standard di Python ed eseguire codice da esso. In questo modo non c'è bisogno di incidere qualcosa di brutto e si ha la meglio dei due mondi.


Ancora una soluzione da considerare è utilizzando il codice shedskin , perché in questo modo si può ottenere C ++ dal codice python che è indipendente dal tempo di esecuzione pitone.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top