Tôi là một nhà văn C++ (MSVC), VB newbie đang cố gắng hỗ trợ một nhà văn VB.net chuyên gia, người đã không thực hiện nhiệm vụ này trước đây.truyền con trỏ tới hàm extern C trong một DLL từ VB
Chúng tôi muốn phát triển cả ứng dụng C/C++ và VB để sử dụng một DLL được viết bằng C++ với các hàm API extern-ed C. Chương trình C++ đang hoạt động tốt. Đó là VB, nơi chúng ta đang gặp khó khăn.
Các DLL cung cấp một chức năng extern C
:
RegisterCallback(void* cbFuncPtr, void* dataPtr);
LƯU Ý 1: Xem phần ghi chú của tôi dưới đây cho một sự thay đổi thiết kế và lý do chúng tôi đã làm cho nó.
CHÚ Ý 2: Cập nhật bổ sung được thêm dưới dạng câu trả lời bên dưới.
nơi hàm callback havs C typedef này:
typedef (void)(* CALL_NACK)(void*);
Các cbFuncPtr
được kỳ vọng sẽ trở thành một con trỏ hàm để một số chức năng VB mà sẽ được gọi là CALL_BACK. Các dataPtr
là một con trỏ đến một cấu trúc dữ liệu có định nghĩa C này:
typedef struct
{
int retCode;
void* a_C_ptr;
char message[500];
} cbResponse_t;
nơi a_C_ptr is an internal pointer in the DLL that the VB can cast to
long`. Nó xác định duy nhất nơi trong DLL gọi lại đã được thực hiện và cho phép chức năng VB nhận ra các cuộc gọi từ cùng một vị trí/khác nhau.
Chúng tôi có thể truy cập và chạy hàm RegisterCallback()
từ VB. Đăng nhập cho thấy chúng ta đạt được điều đó và dữ liệu đó được truyền vào. Đó là dữ liệu thực tế dường như là vấn đề.
Khi đọc khoảng một triệu mục diễn đàn, chúng tôi đã học được rằng VB không biết con trỏ là gì và cấu trúc VB không chỉ là bộ nhớ có tổ chức. Chúng tôi khá chắc chắn rằng "địa chỉ" của một cấu trúc VB không phải là những gì mà C nghĩ là một địa chỉ. Chúng tôi đã thấy các tham chiếu lặp đi lặp lại để "marshaling" và "managed data", nhưng thiếu hiểu biết đủ để biết điều gì đang cho chúng tôi biết.
Làm thế nào chúng ta nên mã VB để cung cấp cho DLL địa chỉ thực thi của hàm gọi lại của nó và làm thế nào để chúng tôi mã lên một cấu trúc VB mà DLL có thể điền vào giống như nó cho C++?
Có thể chúng ta cần một hàm DLL trong đó ứng dụng gọi điện có thể nói "C" hoặc "VB" và có phải xử lý các con trỏ sturcture khác nhau không? Nếu vậy, làm thế nào một mã C lên để điền vào cấu trúc VB?
này [MS bài viết về làm thế nào để dữ liệu marshall đến một DLL] (http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx) ít nhất có vẻ như nó có thể áp dụng .Nó được liên kết với [bài viết này về việc gọi C++ DLL từ VB] (http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/4c486d10-fe8b-49da-a5f1-8054b82251ff/). Tôi không phải là một lập trình viên VB hoặc .NET, vì vậy tôi có thể bị mất điểm. –
@DaveNewman Bài đăng cuối cùng cho cuộc thảo luận đó đã là một trợ giúp lớn. Là một lập trình viên C ý tưởng rằng dữ liệu có thể chỉ lên và di chuyển xung quanh và các con trỏ đến nó chỉ được tin cậy trong khoảng chừng nào câu lệnh truy vấn chúng, là dị giáo. Đoán tôi sẽ phải tạo cấu trúc ở phía bên DLL nói cho ứng dụng biết nơi tôi đặt dữ liệu. Điều đó đánh bại ý tưởng cho phép ứng dụng sở hữu dữ liệu sao cho nó sẽ ở đó bất chấp việc DLL có thể làm gì. –
Theo như tôi biết, trong vb.net nó rất hữu ích để thích cấu trúc IntPtr cho con trỏ. Nhưng nếu bạn đã có một định nghĩa con trỏ, không chắc chắn nếu thực sự cần thiết. Con trỏ cũng có sẵn trong vb.net, chỉ cần một chút khó khăn hơn để tìm thấy – Amegon