Какое правильное объявление VB6 для этой функции C ++?
LPCWSTR* MW_ListReaders(_ULONG Context, int* NumberOfReaders);
Следующее дало мне «Плохое соглашение о вызове DLL»:
Private Declare Function ListReaders Lib "MyDLL.dll" (ByVal Context As Long, _
ByRef NumberOfReaders As Integer) As Long
В этом объявлении C ++ нет соглашения о вызовах. Большинство компиляторов C / C ++ по умолчанию __cdecl
, Если функция действительно использует __cdecl
тогда вы не сможете вызвать его в VB6:
Как вызывать функции C, использующие соглашение о вызовах _cdecl
Невозможно напрямую вызвать функцию C в DLL, если эта функция использует соглашение о вызовах _cdecl. Это связано с тем, что Visual Basic использует соглашение о вызовах _stdcall для вызова функций. Это проблема, потому что если используется _cdecl, вызывающая функция отвечает за очистку стека. Однако, если используется _stdcall, вызываемая функция отвечает за очистку стека.
ПРИМЕЧАНИЕ. Файл .EXE, созданный в Visual Basic, позволит вам без ошибок вызывать функцию DLL, которая была объявлена с соглашением о вызовах _cdecl. Только при попытке вызвать такую функцию при запуске программы из среды разработки Visual Basic Visual Basic генерирует следующую ошибку:
Ошибка выполнения ’49’:
Соглашение о неправильном вызове DLLТот факт, что версия EXE позволяет вам вызывать такие функции, был подтвержден Microsoft как ошибка. Вы не должны полагаться на это поведение, поскольку оно может измениться в будущих версиях Visual Basic.
В дополнение к ответу Реми, вы также немного ошиблись в объявлении Vb:
Private Declare Function ListReaders Lib "MyDLL.dll" (ByVal Context As Long, ByRef NumberOfReaders As Long) As Long
«Integer» — это 2-байтовое целое число в vb.