EDIT: Avendo ottenuto che questo funzioni a 32 bit, ora sto cercando di farlo funzionare per 64 bit. Ho ottenuto il codice sorgente per la DLL e sia la DLL che l'applicazione sono state compilate per 64-bit. Ottengo una violazione di accesso ogni volta. Ecco il codice DLL (C++ in Visual Studio 2005):Convertire il tipo di Visual Basic 6.0 in "Struttura" VB.NET
#pragma pack(push, 2)
// Output Results Structure
typedef struct tagTVA_RESULTS {
int iID; /* Difference ID 1 .. n */
int iLeft; /* Bounding rectangle */
int iRight;
int iTop;
int iBottom;
double dCx; /* Center of gravity */
double dCy;
double dMajor; /* Shape information */
double dMinor;
double dAngle; /* Rotational information */
int lArea; /* Number of pixels */
int iEdge; /* Set if difference is at the edge of the image */
double dNormalDensity;
int iNormalCount;
double dDifferenceDensity;
} TVA_RESULTS, *PTVA_RESULTS;
#pragma pack (pop)
Nota è l'impostazione del pacchetto di 2. Ho provato impostandolo a 2 nella domanda, nonché, e non riesce. Ho provato altri valori e ho persino provato valori non uguali. Ho provato esplicitamente usando 4 come dimensione intera e 8 come dimensione doppia. Ma suppongo (con una conoscenza limitata) che se entrambe le dimensioni dei pacchi sono uguali, dovrebbe funzionare.
A questo punto, sospetto come viene chiamata la funzione. Il suo primo parametro è un puntatore a una matrice di queste strutture. L'applicazione passa nel primo elemento dell'array ByRef, che a mio parere lo realizza. Ma avere un cattivo puntatore all'array spiegherebbe i sintomi. Ecco la definizione della funzione nella DLL.
int WINAPI MNtvaAnalyzeVB (TVA_RESULTS *pResults, int iMaxCount)
Il mio capo ha suggerito che potrebbe essere un problema big/little endian, ma che sembra improbabile, se sono entrambi di essere compilati nello stesso ambiente.
Cosa devo fare?
Fine modifica >>>
sto convertendo un'applicazione Visual Basic 6.0 a VB.NET. Ho un paio di strutture che vengono passate a file DLL esterni. Questo non funziona, e ho la sensazione che sia dovuto al fatto che le strutture non vengano passate correttamente.
Ecco la struttura originale:
Public Type TVA_PARAMETERS
iStandardFilterOnOff As Long
iSampleFilterOnOff As Long
iDifferenceFilterOnOff As Long
iRotationCorrectionOnOff As Long
iLocalCorrectionOnOff As Long
iStandardAOIx As Long
iStandardAOIy As Long
iStandardAOIdx As Long
iStandardAOIdy As Long
iSampleAOIx As Long
iSampleAOIy As Long
iSampleAOIdx As Long
iSampleAOIdy As Long
iRepeatHorizontal As Long
iRepeatVertical As Long
dSensitivity As Double
iMergeWidth As Long
iMergeHeight As Long
iMinimumDifferenceArea As Long
iMaximumDifferenceArea As Long
End Type
Se faccio un LenB su una variabile di quel tipo in Visual Basic 6.0, ottengo 84 byte. (NB: non sono sicuro se questo è un modo valido per determinare la sua dimensione.)
ho cercato di convertirlo in VB.NET così:
Public Structure TVA_PARAMETERS
Public iStandardFilterOnOff As Integer
Public iSampleFilterOnOff As Integer
Public iDifferenceFilterOnOff As Integer
Public iRotationCorrectionOnOff As Integer
Public iLocalCorrectionOnOff As Integer
Public iStandardAOIx As Integer
Public iStandardAOIy As Integer
Public iStandardAOIdx As Integer
Public iStandardAOIdy As Integer
Public iSampleAOIx As Integer
Public iSampleAOIy As Integer
Public iSampleAOIdx As Integer
Public iSampleAOIdy As Integer
Public iRepeatHorizontal As Integer
Public iRepeatVertical As Integer
Public dSensitivity As Double
Public iMergeWidth As Integer
Public iMergeHeight As Integer
Public iMinimumDifferenceArea As Integer
Public iMaximumDifferenceArea As Integer
End Structure
In VB.NET, System.Runtime.InteropServices.Marshal.sizeof() dà 88 byte. Speravo dal momento che questi sono solo valori numerici che avrebbero funzionato (so che le corde possono essere un dolore). Non ho il codice per la funzione esterna, ma è dichiarato così:
Declare Function MNtvaParameters Lib "MNTva.dll" (ByRef pParameters As TVA_PARAMETERS) As Integer
Sto indovinando questa struttura non è la stessa dimensione, quindi la chiamata di file DLL non riesce, ma ottengo alcun errore, e come ho detto, non ho il codice per guardarlo. Restituisce uno zero, come dovrebbe, se ha successo, ma chiaramente non ha effettivamente un effetto.
Ho giocato un po 'con Runtime.InteropServices.StructLayoutAttribute, ma se questa è la risposta, non riesco a determinare i parametri corretti.
Ho un'altra struttura come questa, ma è molto simile. Immagino che se riuscirò a sistemare questo, sarò in grado di aggiustare l'altro.
Non ho idea di cosa sia questa domanda, ma sembra interessante, quindi +1. :) – Neolisk
@Neolisk: Probabilmente è "Ho un paio di strutture che vengono passate a DLL esterne. Questo non funziona". –