Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции из DLL / 11 сообщений из 11, страница 1 из 1
29.06.2017, 20:47
    #39479970
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
пишу в RadStudio C++

сделал вызов функций из DLL (подключение к устройству)
эта часть кода выполняется нормально:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
String Worda = "plcommpro.dll";
	wchar_t* plcommpro = Worda.w_str();
	hDLL = LoadLibrary(plcommpro);
	if (!hDLL) {
	  ShowMessage("Невозможно загрузить plcommpro.dll");
	  return;
	}

кнопкой вызываю функцию подключения:
        typedef int (__cdecl * Connectos)(const char *param);
	Connectos Connect = (Connectos)GetProcAddress(hDLL, "Connect");
	//String W = "protocol=TCP,ipaddress=" +Edit1->Text+ ",port=4370,timeout=2000,passwd=";
	//wchar_t* ytt = W.w_str();
	const char *Parameters = "protocol=TCP,ipaddress=192.168.5.48,port=4370,timeout=2000,passwd="; // 192.168.5.48
	int h = Connect(Parameters);
	if (h != 0)
	{
		StaticText1->Caption = "Подключено";
		isConnect = true;
		Edit1->Enabled = false;
	}
	else
	{
		StaticText1->Caption = "не Подключено";
		isConnect = false;
		Edit1->Enabled = true;
	}



если пытаюсь отключиться от устройства, следующим кодом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
if (isConnect)
	{
		typedef int (__cdecl * EP)(void);
		EP ExecProc = (EP)GetProcAddress(hDLL, "Disconnect");
		int h = ExecProc();
		StaticText1->Caption = "неПодключено";
		isConnect = false;
		Edit1->Enabled = true;
	}



то выскакивает ошибка типа Access violation at adress .... ... в модуле plcommpro.dll
Функция Disconect в dll есть. смотрел список.

EXPORTS
Base64WriteToBMP @21 ; Base64WriteToBMP
Connect @10 ; Connect
ControlDevice @18 ; ControlDevice
DeleteDeviceData @15 ; DeleteDeviceData
Disconnect @11 ; Disconnect
GetAttLogFileData @30 ; GetAttLogFileData
GetDeviceData @12 ; GetDeviceData
GetDeviceDataCount @14 ; GetDeviceDataCount
GetDeviceFileData @28 ; GetDeviceFileData
GetDeviceParam @16 ; GetDeviceParam
...
Рейтинг: 0 / 0
29.06.2017, 21:46
    #39479996
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Mizer73,

Я бы попробовал передать ей параметром хендл, который возвращает коннект.

Можно попробовать дизассемблировать и посмотреть сколько параметров ожидает функция.
Но в целом без документации - долго трахаться
...
Рейтинг: 0 / 0
29.06.2017, 21:50
    #39479997
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Ах да, для неопытных.

Про вызовы

cdecl - значит количество байт параметров не узнаешь - только если "разобрать" работающий пример
...
Рейтинг: 0 / 0
29.06.2017, 21:53
    #39480000
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
...
Рейтинг: 0 / 0
30.06.2017, 13:14
    #39480336
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Mizer73, посмотри примеры в SDK от производителя библиотеки. Там все функции, вызываемые через маршалинг из dotNet, описаны как функции библиотек с неуправляемым кодом. Иными словами, там обычный API с соглашением вызова __stdcall. Вызывай также, как написано в примерах для dotNet.
...
Рейтинг: 0 / 0
30.06.2017, 18:58
    #39480627
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Siemargl,

это не оно. Оно это "PullSDK Interfaces User Guide".
Примеры там скромные, для С# и Pithon.


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
.2 Disconnect
[Function]
Void Disconnect(HANDLE handle)
[Objective]
The function is used to disconnect the device.
[Parameter description]
handle
[in]: The handle that is returned when the connection is successful.
[Returned value]
None
[Example]
Python:
self.commpro.Disconnect(self.hcommpro)
self.hcommpro = 0
c#:
Disconnect(h);
h = IntPtr.Zero;
...
Рейтинг: 0 / 0
30.06.2017, 19:00
    #39480629
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
SiemarglMizer73,

Я бы попробовал передать ей параметром хендл, который возвращает коннект.

Можно попробовать дизассемблировать и посмотреть сколько параметров ожидает функция.
Но в целом без документации - долго трахаться

да, там есть в параметрах хендл.
...
Рейтинг: 0 / 0
30.06.2017, 19:04
    #39480630
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Mizer73,

Обязательно надо определиться с типом вызова - cdecl или stdcall

Иначе будет портиться стек и вылетать на 2м вызове
...
Рейтинг: 0 / 0
03.07.2017, 10:56
    #39481526
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Siemargl, там stdcall (по умолчанию в Csharp).
...
Рейтинг: 0 / 0
03.07.2017, 11:04
    #39481541
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Mizer73Siemargl,

это не оно. Оно это "PullSDK Interfaces User Guide".
Примеры там скромные, для С# и Pithon.И чем тебя не устраивают примеры на Csharp?
Вот же в "PLDemo.cs" - "чёрным по белому"!!!:
Код: c#
1.
2.
[DllImport("plcommpro.dll", EntryPoint = "Disconnect")]
public static extern void Disconnect(IntPtr h);

значит указатель на нее будет:
Код: plaintext
1.
void (__stdcall *fpDisconnect)(HANDLE hndl);
...
Рейтинг: 0 / 0
09.10.2017, 21:42
    #39533696
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из DLL
Mizer73SiemarglMizer73,

Обязательно надо определиться с типом вызова - cdecl или stdcall

Иначе будет портиться стек и вылетать на 2м вызове




вызов через stdcall я не скумекал
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции из DLL / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]