Я приобрел библиотеку DLL, созданную в Visual Basic, у стороннего поставщика ( Sensor DLL.dll ).Эта DLL содержит функции для общения с датчиком, и мне нужно вызывать эти функции из программы на Visual C ++, которую я пишу.Поставщик не предоставит файл заголовка, и я не знаю Visual Basic.Если бы у меня был заголовочный файл, это был бы 15-минутный проект ... вместо этого я все еще борюсь с ним неделю спустя.Пожалуйста, помогите!
Мне сказали, что одна функция ( Get_Data ) в DLL имеет вид:
Public Function Get_Data(ByVal Handle As String) As String
Я пробовал несколько методов для вызова этой функции Get_Dataбезуспешно:
Способ 1) атрибут DllImport
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
namespace Sensor
{
[DllImport ("Sensor DLL.dll", EntryPoint = "Get_Data", CharSet = System:: Runtime :: InteropServices :: CharSet :: Unicode)] BSTR Get_Data (дескриптор BSTR);}
//then I call the function
Sensor::Get_Data(Handle);
Этот метод, похоже, наиболее близок к тому, что я получил для решения.Он компилируется, но выдает следующую ошибку при запуске:
Произошло необработанное исключение типа 'System.EntryPointNotFoundException'
Дополнительная информация: Невозможно найти точку входа с именем 'Get_Data'in DLL' Sensor DLL.dll '.
Я пробовал различные комбинации / перестановки типов данных, кроме BSTR, включая BSTR *, wchar_t, int и т. д. Возможно, я пропустил одну, но каждый тип данныхвозвращает ту же ошибку.
Метод 2) Атрибут класса хранения dllimport
__declspec(dllimport) BSTR Get_Data(BSTR Handle);
//then I call the function
Get_Data(Handle);
Этот метод вводит меня в заблуждение, поскольку я не задаю нужную DLLимпортировать из.Я скопировал DLL в папку проекта и добавил ее в проект вручную, так что, надеюсь, это означает, что ее можно найти.При компиляции компоновщик возвращает следующие ошибки:
ошибка LNK2028: неразрешенный токен (0A00034F) "wchar_t * __cdecl Get_Data (wchar_t *)" (? Get_Data @@ $$ FYAPA_WPA_W @ Z), на который есть ссылки вфункция "int __cdecl main (void)" (? main @@ $$ HYAHXZ)
ошибка LNK2019: неразрешенный внешний символ "wchar_t * __cdecl Get_Data (wchar_t *)" (? Get_Data @@ $$ FYAPA_WPA_W @ Z) упоминается в функции "int __cdecl main (void)" (? main @@ $$ HYAHXZ)
Я подозревал, что это может означать, что я должен использовать wchar_t или wchar_t * вместо BSTR, но изменить налюбой тип данных приводит к той же ошибке.
Метод 3) GetProcAddress
typedef BSTR (*Get_Data_Ptr)(BSTR Handle);
HINSTANCE LoadMe;
LoadMe = LoadLibraryA("Sensor DLL.dll");
if (!LoadMe)
std::cout << "\nDLL failed to load!\n";
Get_Data_Ptr LibMainGet_Data;
LibMainGet_Data = (Get_Data_Ptr)GetProcAddress(LoadMe,"Get_Data");
//then I call the function
LibMainGet_Data(Handle);
Компилируется, но при запуске выдает следующую ошибку:
Произошло необработанное исключение типа 'System.AccessViolationException'
Дополнительная информация: Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.
Когда я нащупываю различные части этого кода в режиме отладки, кажется, что, как и в первом методе, он также не смог найти точку входа 'Get_Data' в DLL.
Кто-нибудь вызывал функции из VB DLL с использованием C ++, если вы сами не создали DLL, у вас нет файлов .idl и т. Д.?У кого-нибудь есть такой рабочий пример, которым вы могли бы поделиться?
Спасибо!