Sono uno scrittore C++ (MSVC), newbie VB che cerca di assistere uno scrittore esperto di VB.net che non ha ancora svolto questa attività in precedenza.passare i puntatori alla funzione esterna C in una DLL da VB
Desideriamo sviluppare entrambe le applicazioni C/C++ e VB per utilizzare una DLL scritta in C++ con funzioni API C esternate. Il programma C++ sta funzionando bene. È VB dove stiamo avendo difficoltà.
La DLL fornisce una funzione di extern C
:
RegisterCallback(void* cbFuncPtr, void* dataPtr);
NOTA 1: Vedere la mia nota di seguito per una modifica di progettazione e le ragioni abbiamo fatto.
NOTA 2: Aggiornamento aggiuntivo aggiunto come risposta di seguito.
in cui la funzione di callback HAVS questo C typedef:
typedef (void)(* CALL_NACK)(void*);
Il cbFuncPtr
dovrebbe essere un puntatore a funzione per qualche funzione VB che andranno chiamato come il CALL_BACK. Il dataPtr
è un puntatore a una struttura di dati che ha questa definizione C:
typedef struct
{
int retCode;
void* a_C_ptr;
char message[500];
} cbResponse_t;
dove a_C_ptr is an internal pointer in the DLL that the VB can cast to
long`. Identifica in modo univoco il punto in cui nella DLL è stata effettuata la richiamata e consente alla funzione VB di riconoscere le chiamate da posizioni identiche o diverse.
Siamo in grado di accedere ed eseguire la funzione RegisterCallback()
da VB bene. La registrazione mostra che siamo arrivati e che i dati sono passati. Sono i dati reali che sembrano essere il problema.
Nella lettura di un milione di voci nel forum abbiamo appreso che VB non sa quali sono i puntatori e che una struttura VB è più di una semplice memoria organizzata. Siamo abbastanza sicuri che l '"indirizzo" di una struttura VB non è quello che C ritiene sia un indirizzo. Abbiamo visto ripetuti riferimenti al "marshaling" e ai "dati gestiti", ma non abbiamo abbastanza comprensione per sapere cosa ci sta dicendo.
Come dovremmo codificare VB per fornire alla DLL l'indirizzo di esecuzione della sua funzione di callback e come possiamo codificare un costrutto VB che la DLL può compilare proprio come fa per C++?
Potrebbe essere necessaria una funzione DLL in cui l'app chiamante può dire "C" o "VB" e la DLL gestisce i puntatori di sturtura in modo diverso? In tal caso, in che modo inserire un codice in C per riempire la struttura VB?
Questo [articolo del ms su come i dati Marshall una DLL] (http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx) almeno sembra che potrebbe applicarsi .È stato collegato a questo [articolo su come chiamare le DLL C++ da VB] (http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/4c486d10-fe8b-49da-a5f1-8054b82251ff/). Non sono un programmatore VB o .NET, quindi potrei essere fuori dal marchio. –
@DaveNewman L'ultimo post di quella discussione è già di grande aiuto. Come programmatore C, l'idea che i dati possano semplicemente muoversi e spostarsi e che i puntatori a esso siano attendibili solo per circa il tempo in cui l'istruzione che li ha interrogati, è un'eresia. Credo che dovrò creare la struttura sul lato DLL e dire all'app dove metto i dati. Ciò sconfigge l'idea di lasciare che l'app possegga i dati in modo che sia lì, nonostante qualsiasi cosa possa fare la DLL. –
Per quanto ne so, in vb.net è molto utile preferire la struttura IntPtr per i puntatori. Ma se hai già una definizione di puntatore, non sei sicuro se davvero necessario. I puntatori sono anche disponibili in vb.net, solo un po 'più difficile da trovare – Amegon