Tôi biết điều này đã được hỏi trước, nhưng tôi không thành công khi cố chuyển đổi một số cấu trúc/công đoàn C++ sang Delphi để sử dụng SDK Hikvision.Làm thế nào để chuyển đổi một liên minh C++ sang Delphi
C++ cấu trúc/đoàn thể tôi đang cố gắng để chuyển đổi như sau:
struct{
BYTE byEnable;
BYTE byRes1[3];
DWORD dwTriggerType;
NET_ITC_TRIGGER_PARAM_UNION uTriggerParam;
BYTE byRes[64];
}NET_ITC_SINGLE_TRIGGERCFG,*LPNET_ITC_SINGLE_TRIGGERCFG;
union{
DWORD uLen[1070];
NET_ITC_POST_IOSPEED_PARAM struIOSpeed;
NET_ITC_POST_SINGLEIO_PARAM struSingleIO;
NET_ITC_POST_RS485_PARAM struPostRs485;
NET_ITC_POST_RS485_RADAR_PARAM struPostRadar;
NET_ITC_POST_VTCOIL_PARAM struVtCoil;
NET_ITC_EPOLICE_IOTL_PARAM struIOTL;
NET_ITC_EPOLICE_RS485_PARAM struEpoliceRs485;
NET_ITC_EPOLICE_RS485_PARAM struPERs485;
}NET_ITC_TRIGGER_PARAM_UNION,*LPNET_ITC_TRIGGER_PARAM_UNION;
Tôi đã thử những điều sau đây:
PNetItcSingleTriggerCfg = ^TNetItcSingleTriggerCfg;
TNetItcSingleTriggerCfg = record
byEnable: Byte;
byRes1: array [0..2] of Byte;
dwTriggerType: DWord;
uTriggerParam: TNetItcTriggerParamUnion;
byRes: array [0..63] of Byte;
end;
PNetItcTriggerParamUnion = ^TNetItcTriggerParamUnion;
TNetItcTriggerParamUnion = record
case integer of
0: (uLen: array [0..1069] of DWord);
1: (struIOSpeed: TNetItcPostIOSpeedParam);
2: (struSingleIO: TNetItcPostSingleIOParam);
3: (struPostRs485: TNetItcPostRS485Param);
4: (struPostRadar: TNetItcPostRS485RadarParam);
5: (struVtCoil: TNetItcPostVTCoilParam);
6: (struHvt: TNetItcPostHvtParam);
7: (struIOTL: TNetItcEPoliceIOTLParam);
8: (struEpoliceRs485: TNetItcEPoliceRS485Param);
9: (struPERs485: TNetItcEPoliceRS485Param);
10:(struPostMpr: TNetItcPostMprParam);
11:(struViaVtCoil: TNetDvrViaVtCoilParam);
12:(struPostImt: TNetItcPostImtParam);
13:(struPostPrs: TNetItcPostPrsParam);
14:(struIpcHvt: TNetIpcPostHvtParam);
15:(struHvtV50: TNetIpcPostHvtParamV50);
end;
Và tôi cũng đã cố gắng có nó như một kỷ lục lồng nhau (như được đề xuất ở đây http://rvelthuis.de/articles/articles-convert.html#unions)
PNetItcSingleTriggerCfg = ^TNetItcSingleTriggerCfg;
TNetItcSingleTriggerCfg = record
byEnable: Byte;
byRes1: array [0..2] of Byte;
dwTriggerType: DWord;
uTriggerParam: record
case integer of
0: (uLen: array [0..1069] of DWord);
1: (struIOSpeed: TNetItcPostIOSpeedParam);
2: (struSingleIO: TNetItcPostSingleIOParam);
3: (struPostRs485: TNetItcPostRS485Param);
4: (struPostRadar: TNetItcPostRS485RadarParam);
5: (struVtCoil: TNetItcPostVTCoilParam);
6: (struHvt: TNetItcPostHvtParam);
7: (struIOTL: TNetItcSingleIOTLParam);
8: (struEpoliceRs485: TNetItcEPoliceRS485Param);
9: (struPERs485: TNetItcEPoliceRS485Param);
10:(struPostMpr: TNetItcPostMprParam);
11:(struViaVtCoil: TNetDvrViaVtCoilParam);
12:(struPostImt: TNetItcPostImtParam);
13:(struPostPrs: TNetItcPostPrsParam);
14:(struIpcHvt: TNetIpcPostHvtParam);
15:(struHvtV50: TNetIpcPostHvtParamV50);
end;
byRes: array [0..63] of Byte;
end;
Tôi đã thấy các câu hỏi tương tự ở đây (I E. How do I translate a C union into Delphi?), nhưng công đoàn trong ví dụ của tôi là ở giữa của cấu trúc, và như tôi hiểu 'kết thúc' của tuyên bố trường hợp cũng kết thúc kỷ lục. Tôi nghĩ rằng tôi hiểu lý thuyết đằng sau một bản ghi biến thể có cùng một cấp phát bộ nhớ cho các trường trong câu lệnh case, do đó, các trường được sử dụng sẽ là/hoặc, nhưng những gì tôi không thể làm ra là cách nói DLL đang truy cập vào các bản ghi này, cho dù đó là struName.unionName.fieldName hoặc struName.fieldName và cũng làm thế nào công đoàn được định nghĩa (nghĩa là bộ chọn của câu lệnh case là gì, và làm thế nào để biết kiểu dữ liệu nào mà bộ chọn là).
Tôi có ba cấu trúc tương tự để dịch và hình dung nếu tôi có thể bẻ khóa một, tôi có thể bẻ khóa tất cả.
Với các bản ghi như được mô tả ở trên, tôi tiếp tục nhận được thông báo lỗi 'Lỗi tham số. Tham số đầu vào hoặc đầu ra trong SDK SDK là NULL trong khi gọi một hàm từ tệp DLL (nếu bạn cần thêm thông tin về điều này, vui lòng hỏi), điều này khiến tôi nghĩ rằng bản ghi của tôi chưa được chuyển đổi chính xác.
Tôi đang sử dụng phiên bản SDK HCNetSDK.dll 5.0.3.20 và IDE của tôi là XE7 nếu điều đó giúp.
Mọi trợ giúp sẽ được đánh giá cao.
FWIW, nhiều hơn về chuyển đổi hồ sơ và công đoàn ở đây: http://rvelthuis.de/articles/articles-convert.html#unions Nhưng như @DavidHeffernan đã nói, chuyển đổi của bạn là OK, nhưng sự liên kết có thể bị tắt. Có một phần về sự liên kết trong bài viết đó. –
Đây thực sự là một bản dupe. https://stackoverflow.com/search?q=%5Bdelphi%5D+union –
Không thực sự là lừa đảo. Người hỏi đã thực hiện nghiên cứu tốt và muốn biết tại sao mã kết quả dường như không hoạt động như mong đợi. –