EDIT: Nachdem ich dies unter 32-Bit zu arbeiten, habe ich jetzt versucht, es für 64-Bit zu arbeiten. Ich habe Quellcode für die DLL erhalten und DLL und Anwendung werden für 64-Bit kompiliert. Ich erhalte jedes Mal eine Zugriffsverletzung. Hier ist der DLL-Code (C++ in Visual Studio 2005):Convert Visual Basic 6.0 Typ zu VB.NET 'Struktur'
#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)
Hinweis es die Packung 2. Einstellung habe ich versucht, es zu 2 in der Anwendung Einstellung als gut, und es funktioniert nicht. Ich habe andere Werte ausprobiert, und ich habe sogar Werte ausprobiert, die nicht gleich waren. Ich habe explizit versucht, 4 als Integer-Größe und 8 als doppelte Größe zu verwenden. Aber ich würde (mit begrenztem Wissen) annehmen, dass, wenn beide Packungsgrößen gleich sind, es funktionieren sollte.
An dieser Stelle vermute ich, wie die Funktion aufgerufen wird. Der erste Parameter ist ein Zeiger auf ein Array dieser Strukturen. Die Anwendung übergibt das erste Element des Arrays ByRef, was ich denke, dass dies erreicht wird. Aber ein schlechter Zeiger auf das Array würde die Symptome erklären. Hier ist die Funktionsdefinition in der DLL.
int WINAPI MNtvaAnalyzeVB (TVA_RESULTS *pResults, int iMaxCount)
Mein Chef schlug es ein big/little endian Problem sein könnte, aber das scheint unwahrscheinlich, wenn sie beide in der gleichen Umgebung zusammengestellt werden.
Was soll ich tun?
Ende bearbeiten >>>
ich eine Visual Basic 6.0-Anwendung VB.NET bin zu konvertieren. Ich habe ein paar Strukturen, die an externe DLL-Dateien weitergegeben werden. Das funktioniert nicht, und ich habe das Gefühl, dass die Strukturen nicht korrekt weitergeleitet werden.
Hier ist die ursprüngliche Struktur ist:
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
Wenn ich einen LenB auf einer Variable dieses Typs in Visual Basic 6.0 zu tun, erhalte ich 84 Bytes. (NB: Ich bin nicht sicher, ob das eine gültige Art und Weise um seine Größe zu bestimmen.)
Ich habe versucht, es zu VB.NET konvertieren thusly:
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() gibt 88 Bytes. Ich hatte gehofft, da dies nur numerische Werte sind, würde das funktionieren (ich weiß, dass Strings ein Schmerz sein können). Ich habe keinen Code für die externe Funktion, aber es wird wie folgt erklärt:
Declare Function MNtvaParameters Lib "MNTva.dll" (ByRef pParameters As TVA_PARAMETERS) As Integer
ich diese Struktur bin zu raten, ist nicht die gleiche Größe, so dass die DLL-Datei Aufruf fehlschlägt, aber ich habe keine Fehler erhalten, und Wie gesagt, ich habe nicht den Code dafür. Es gibt eine Null zurück, wie es sollte, wenn es erfolgreich ist, aber es hat eindeutig keine Wirkung.
Ich habe ein bisschen mit Runtime.InteropServices.StructLayoutAttribute gespielt, aber wenn das die Antwort ist, kann ich die richtigen Parameter nicht bestimmen.
Ich habe eine andere Struktur wie diese, aber es ist so ähnlich. Ich schätze, wenn ich das Problem beheben kann, kann ich das andere reparieren.
Ich habe keine Ahnung, worum es bei dieser Frage geht, aber es sieht cool aus, also +1. :) – Neolisk
@Neolisk: Es ist wahrscheinlich die "Ich habe ein paar Strukturen, die an externe DLLs übergeben werden. Das funktioniert nicht". –