CHỈNH SỬA: Đã làm việc này dưới 32 bit, tôi hiện đang cố gắng làm cho nó hoạt động với 64 bit. Tôi đã nhận được mã nguồn cho DLL và cả hai DLL và ứng dụng đang được biên dịch cho 64-bit. Tôi bị vi phạm quyền truy cập mỗi lần. Đây là mã DLL (C++ trong Visual Studio 2005):Chuyển đổi loại Visual Basic 6.0 sang VB.NET 'Cấu trúc'
#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)
Lưu ý nó thiết lập các gói để 2. Tôi đã thử đặt nó đến 2 trong ứng dụng là tốt, và nó không thành công. Tôi đã thử các giá trị khác và thậm chí tôi đã thử các giá trị không giống nhau. Tôi đã thử rõ ràng bằng cách sử dụng 4 như kích thước nguyên và 8 là kích thước gấp đôi. Nhưng tôi sẽ giả định (với kiến thức hạn chế) rằng nếu cả hai kích thước gói đều giống nhau, nó sẽ hoạt động.
Tại thời điểm này, tôi nghi ngờ cách hàm được gọi. Tham số đầu tiên của nó là một con trỏ tới một mảng của các cấu trúc này. Ứng dụng này chuyển qua phần tử đầu tiên của mảng ByRef, mà tôi nghĩ là hoàn thành điều này. Nhưng có một con trỏ xấu đến mảng sẽ giải thích các triệu chứng. Đây là định nghĩa hàm trong DLL.
int WINAPI MNtvaAnalyzeVB (TVA_RESULTS *pResults, int iMaxCount)
Sếp của tôi cho rằng đây có thể là vấn đề big/little endian, nhưng dường như chúng không được biên soạn trong cùng một môi trường.
Tôi nên làm gì?
Kết thúc chỉnh sửa >>>
Tôi đang chuyển đổi một ứng dụng Visual Basic 6.0 để VB.NET. Tôi có một vài cấu trúc được chuyển tới các tệp DLL bên ngoài. Điều này không hiệu quả, và tôi có cảm giác đó là do các cấu trúc không được truyền chính xác.
Dưới đây là cấu trúc ban đầu:
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
Nếu tôi làm một LenB vào một biến kiểu đó trong Visual Basic 6.0, tôi nhận được 84 byte. (NB: Tôi không chắc chắn nếu đó là một cách hợp lệ để xác định kích thước của nó.)
Tôi đã cố gắng để chuyển nó sang VB.NET 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
Trong VB.NET, System.Runtime.InteropServices.Marshal.sizeof() cho 88 byte. Tôi đã hy vọng vì đây chỉ là giá trị số này sẽ làm việc (tôi biết dây có thể là một nỗi đau). Tôi không có mã cho chức năng bên ngoài, nhưng nó tuyên bố như thế này:
Declare Function MNtvaParameters Lib "MNTva.dll" (ByRef pParameters As TVA_PARAMETERS) As Integer
Tôi đoán cấu trúc này không phải là kích thước tương tự, vì vậy cuộc gọi tập tin DLL bị lỗi, nhưng tôi nhận được không có lỗi, và như tôi đã nói, tôi không có mã để xem nó. Nó trả về một số không, như là nếu nó thành công, nhưng rõ ràng là nó không thực sự có hiệu lực.
Tôi đã chơi xung quanh một chút với Runtime.InteropServices.StructLayoutAttribute, nhưng nếu đó là câu trả lời, tôi không thể xác định đúng thông số.
Tôi có một cấu trúc như thế này, nhưng nó rất giống nhau. Tôi đoán nếu tôi có thể sửa cái này, tôi sẽ có thể sửa cái kia.
Tôi không biết câu hỏi này là gì, nhưng có vẻ thú vị, vì vậy +1. :) – Neolisk
@Neolisk: Có lẽ là "Tôi có một vài cấu trúc được chuyển tới các tệp DLL bên ngoài. Điều này không hoạt động". –