Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с DLL / 20 сообщений из 20, страница 1 из 1
09.10.2017, 21:32
    #39533689
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
есть код (приведен ниже).
к устройству подключается нормально. а при попытке отключиться, выдает ошибку в модуле 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
// загрузка DLL
void __fastcall TForm3::FormCreate(TObject *Sender)
{
	String Worda = "plcommpro.dll";
	wchar_t* plcommpro = Worda.w_str();
	//hDLL = LoadLibraryEx (plcommpro, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
	hDLL = LoadLibrary(plcommpro);
	if (!hDLL) {
	  ShowMessage("Невозможно загрузить plcommpro.dll");
	  return;
	}
	}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
	if (isConnect)
	{
		typedef int (__cdecl * EP)(void);
		EP ExecProc = (EP)GetProcAddress(hDLL, "Disconnect");
		int h = ExecProc();
	}
	FreeLibrary(hDLL);
}
//---------------------------------------------------------------------------
// подключение
void __fastcall TForm3::Button1Click(TObject *Sender)
{
	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.49,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;
	}
}
//---------------------------------------------------------------------------
// отключение
void __fastcall TForm3::Button2Click(TObject *Sender)
{
	if (isConnect)
	{
		typedef int (__cdecl * EP)(void);
		EP ExecProc = (EP)GetProcAddress(hDLL, "Disconnect");
		int y = ExecProc();
		StaticText1->Caption = "неПодключено";
		isConnect = false;
		Edit1->Enabled = true;
	}
}
//---------------------------------------------------------------------------
...
Рейтинг: 0 / 0
10.10.2017, 05:08
    #39533745
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73, в каком месте падает? Возможно, ещё какой-то код выполняется из DLL, а уже произошла выгрузка её из памяти.
...
Рейтинг: 0 / 0
10.10.2017, 11:39
    #39533922
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
CEMbMizer73, в каком месте падает?Какая разница? Ошибка-то с пустым текстом. А раз она еще и в "модуле DLL", т.е. в неизвестно какой, безымянной... Решить проблему не удастся все равно. Тут неповезло просто, бывает.
...
Рейтинг: 0 / 0
10.10.2017, 11:55
    #39533938
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Код: plaintext
1.
2.
		EP ExecProc = (EP)GetProcAddress(hDLL, "Disconnect");
		int h = ExecProc();


GetProcAddress может вернуть NULL, по-хорошему сначала проверить надо, затем вызывать.
...
Рейтинг: 0 / 0
11.10.2017, 20:32
    #39535021
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Dima T,

как проверить?
...
Рейтинг: 0 / 0
11.10.2017, 20:36
    #39535023
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73Dima T,

как проверить?
Сам не догадался?
Как-то так
Код: plaintext
1.
2.
3.
4.
5.
		EP ExecProc = (EP)GetProcAddress(hDLL, "Disconnect");
		if(ExecProc != NULL) {
			int h = ExecProc();
			...
		}
...
Рейтинг: 0 / 0
11.10.2017, 20:51
    #39535026
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Dima T,

а что это даст? Я проверяю это через состояние соединено или не соединено.
и если соединено, то пытаюсь отключиться. и конец.
...
Рейтинг: 0 / 0
11.10.2017, 20:53
    #39535028
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73а что это даст?
прога не упадет, если там NULL
...
Рейтинг: 0 / 0
11.10.2017, 20:58
    #39535031
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
[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
...
Рейтинг: 0 / 0
11.10.2017, 21:02
    #39535033
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73[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

как этот HANDLE получить?
...
Рейтинг: 0 / 0
11.10.2017, 21:15
    #39535039
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73как этот HANDLE получить?

Помедитировать над "The handle that is returned when the connection is successful."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.10.2017, 21:32
    #39535048
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Dimitry SibiryakovMizer73как этот HANDLE получить?

Помедитировать над "The handle that is returned when the connection is successful."


неченм медетировать )))

передел по совету народа подключение

Код: plaintext
1.
2.
3.
4.
5.
typedef int (__stdcall *Connectos)(const char* param);
	Connectos Connect = (Connectos)GetProcAddress(hDLL, "Connect");
	const char *param = "protocol=TCP,ipaddress=192.168.5.49,port=4370,timeout=2000,passwd=";
	int h = Connect(param);
	if (h != 0)
...
Рейтинг: 0 / 0
11.10.2017, 21:36
    #39535052
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Народ, подскажите, как правильно сделать дисконект


Код: plaintext
1.
2.
3.
typedef void (__stdcall *DisConnectos)(??????);
DisConnectos ExecProc = (DisConnectos)GetProcAddress(hDLL, "Disconnect");
ExecProc(??????);
...
Рейтинг: 0 / 0
12.10.2017, 01:32
    #39535112
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Феерично!
...
Рейтинг: 0 / 0
12.10.2017, 07:40
    #39535139
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73Народ, подскажите, как правильно сделать дисконект


Код: plaintext
1.
2.
3.
typedef void (__stdcall *DisConnectos)(??????);
DisConnectos ExecProc = (DisConnectos)GetProcAddress(hDLL, "Disconnect");
ExecProc(??????);



Можешь дать ссылку на документацию, где описана эта функция Disconnect?
...
Рейтинг: 0 / 0
12.10.2017, 07:49
    #39535140
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73Народ, подскажите, как правильно сделать дисконект


Код: plaintext
1.
2.
3.
typedef void (__stdcall *DisConnectos)(??????);
DisConnectos ExecProc = (DisConnectos)GetProcAddress(hDLL, "Disconnect");
ExecProc(??????);


Код: plaintext
1.
2.
3.
typedef void (__stdcall *DisConnectos)(int);
DisConnectos ExecProc = (DisConnectos)GetProcAddress(hDLL, "Disconnect");
ExecProc(h из Connect());
...
Рейтинг: 0 / 0
12.10.2017, 08:13
    #39535149
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Dima T
Код: plaintext
1.
ExecProc(h из Connect());

Ну что ты. Он ведь поймет буквально и будет спрашивать тут, почему undeclared identifier из.
...
Рейтинг: 0 / 0
12.10.2017, 17:42
    #39535575
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Dima TMizer73Народ, подскажите, как правильно сделать дисконект


Код: plaintext
1.
2.
3.
typedef void (__stdcall *DisConnectos)(??????);
DisConnectos ExecProc = (DisConnectos)GetProcAddress(hDLL, "Disconnect");
ExecProc(??????);


Код: plaintext
1.
2.
3.
typedef void (__stdcall *DisConnectos)(int);
DisConnectos ExecProc = (DisConnectos)GetProcAddress(hDLL, "Disconnect");
ExecProc(h из Connect());




Спасибо огромное, заработало.
...
Рейтинг: 0 / 0
13.10.2017, 03:30
    #39535757
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
Mizer73,

О боже.. Ты 4 месяца делаешь это... =_= Ну как, прорыв есть?
...
Рейтинг: 0 / 0
13.10.2017, 09:48
    #39535827
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DLL
НяшикMizer73,

О боже.. Ты 4 месяца делаешь это... =_= Ну как, прорыв есть? Ну сказал же, что заработало вчера)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с DLL / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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