Jestem pisarz C++ (MSVC), początkujący VB próbuje pomóc ekspertowi pisarz VB.net, który właśnie nie zrobił tego zadania wcześniej.przekazywanie wskaźników do extern funkcji C w DLL z VB
Chcemy rozwijać aplikacje C/C++ i VB, aby korzystać z biblioteki DLL napisanej w C++ z zewnętrznymi funkcjami API C. Program w C++ działa dobrze. To VB, gdzie mamy trudności.
DLL zapewnia extern C
funkcję:
RegisterCallback(void* cbFuncPtr, void* dataPtr);
UWAGA 1: Patrz mój komentarz poniżej o zmianie projektu, a powodów udało się.
UWAGA 2: Dodatkowa aktualizacja została dodana jako odpowiedź poniżej.
gdzie funkcja zwrotna Choroba wibracyjna to C typedef:
typedef (void)(* CALL_NACK)(void*);
cbFuncPtr
ma być wskaźnik funkcji do niektórych funkcji VB, że dostanie zwanej jako CALL_BACK. dataPtr
jest wskaźnikiem do struktury danych, która ma tę definicję C:
typedef struct
{
int retCode;
void* a_C_ptr;
char message[500];
} cbResponse_t;
gdzie a_C_ptr is an internal pointer in the DLL that the VB can cast to
long`. Jednoznacznie identyfikuje miejsce w bibliotece DLL wywołania zwrotnego i pozwala funkcji VB rozpoznawać połączenia z tych samych/różnych lokalizacji.
Jesteśmy w stanie uzyskać dostęp i uruchomić funkcję RegisterCallback()
z VB w porządku. Rejestrowanie pokazuje, że dostaliśmy się tam i dane są przekazywane. To rzeczywiste dane wydają się być problemem.
Czytając o milionie wpisów na forum dowiedzieliśmy się, że VB nie wie, jakie są wskaźniki, a struktura VB to więcej niż tylko uporządkowana pamięć. Jesteśmy prawie pewni, że "adres" struktury VB nie jest tym, co C uważa za adres. Widzieliśmy powtarzające się odniesienia do "marszu" i "zarządzanych danych", ale brakuje im wystarczającej wiedzy, aby wiedzieć, co nam to mówi.
W jaki sposób powinniśmy zakodować VB, aby dać DLLowi adres wykonywania swojej funkcji wywołania zwrotnego i jak możemy zakodować konstrukt VB, który DLL może wypełnić tak samo, jak robi to dla C++?
Czy potrzebujemy funkcji DLL, w której aplikacja wywołująca może powiedzieć "C" lub "VB" i czy biblioteka DLL radzi sobie z wskaźnikami wytrzymałościowymi inaczej? Jeśli tak, to w jaki sposób można zakodować kod C, aby wypełnić strukturę VB?
Ten [MS artykuł o tym, jak dane Marshalla DLL] (http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx) przynajmniej wygląda to może zastosować .To było związane z tym [artykułem o wywołaniu C++ DLLs z VB] (http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/4c486d10-fe8b-49da-a5f1-8054b82251ff/). Nie jestem programistą VB lub .NET, więc mogę być nie na miejscu. –
@DaveNewman Ostatnia publikacja do tej dyskusji jest już bardzo pomocna. Jako programista kategorii C pomysł, że dane mogą się poruszać w górę i poruszać, a to jest dla nich wskazany, jest zaufany tylko tak długo, jak długo oświadczenie, które ich wypytywało, jest herezją. Chyba będę musiał stworzyć strukturę po stronie DLL i powiedzieć aplikacji, gdzie umieściłem dane. To pokonuje pomysł, aby aplikacja posiadała dane tak, aby były dostępne niezależnie od tego, co może zrobić biblioteka DLL. –
O ile mi wiadomo, w vb.net bardzo przydatne jest preferowanie struktury IntPtr dla wskaźników. Ale jeśli już masz definicję wskaźnika, nie wiesz, czy naprawdę potrzebujesz. Wskaźnik jest również dostępny w vb.net, tylko nieco trudniej znaleźć – Amegon