Задать вопрос

В чем причина ошибки при подключении COM порта через dll?

Делаю dll для подключения устройства через COM порт. Не могу понять в чем причина ошибки.
С вызовом функции из dll проблем нет. При отладке могу зайти в нее через F11 и смотреть ход выполнения, но при попытке открытия COM порта с CreateFile выпадает
Первый этап обработки исключения по адресу 0x00021478 в dll_check.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00021478.
Необработанное исключение по адресу 0x00021478 в dll_check.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00021478.

Кусок кода функции из dll.
extern "C" _declspec(dllexport) int connectAr(){
HANDLE hSerial;
LPCTSTR sPortName = L"COM3";
hSerial = ::CreateFile(sPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//ошибка выпадает при попытке вызова  CreateFile

Вроде просмотрел книжки по winAPI, но там ничего похожего не описывается. У меня 2 варианта. Либо ошибка связана с указателями, но я не знаю, что здесь можно исправить, либо что-то с SECURITY_ATTRIBUTES.
Если я делаю не dll, а экзешник, то проблем с подключением нет. COM порт работает. То есть проблема еще может быть связана с вызовом winapi функции именно не напрямую, а из dll.
Вызов dll функции
HINSTANCE hDllInstance = LoadLibraryEx(L"mydll.ll", 0, DONT_RESOLVE_DLL_REFERENCES);
	typedef int(*functionDll)();
	functionDll fpFunction = (functionDll)GetProcAddress(hDllInstance, "connectAr");
	int n = fpFunction();
  • Вопрос задан
  • 3866 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@amberav Автор вопроса
Проблема решена. Подключил библиотеку через LoadLibrary, а не через LoadLibraryEx.
Дело было в параметре DONT_RESOLVE_DLL_REFERENCES. Поэтому если внутри dll необходимо открыть, например, COM-порт, необходимо использовать либо LoadLibrary, либо в функции LoadLibraryEx использовать LOAD_WITH_ALTERED_SEARCH_PATH.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы