Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите с вызовом функции DLL / 4 сообщений из 4, страница 1 из 1
08.06.2017, 12:58
    #39468538
Mizer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с вызовом функции DLL
что делаю не так?

String Worda = "plcommpro.dll";
wchar_t* plcommpro = Worda.w_str();
hDLL = LoadLibrary(plcommpro);
if (!hDLL) {
ShowMessage("Невозможно загрузить plcommpro.dll");
return;
}
typedef void __cdecl (*Connectos)(char *param);
Connectos Connecto = (Connectos)GetProcAddress(hDLL, "Connect");
const char *Parameters = "protocol=TCP,ipaddress=192.168.12.154,port=4370,timeout=2000,passwd=";
int h = Connecto(Parameters);


на строку int h = Connecto(Parameters);
ругается [bcc32 Error] Unit3.cpp(46): E2034 Cannot convert 'const char *' to 'char *'

не могу их соединить
...
Рейтинг: 0 / 0
08.06.2017, 13:08
    #39468553
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с вызовом функции DLL
В сообщении об ошибке все написано, нельзя передавать const char* вместо char*
Код: plaintext
1.
2.
3.
	typedef void __cdecl (*Connectos)(char *param);
	Connectos Connecto = (Connectos)GetProcAddress(hDLL, "Connect");
	const char *Parameters = "protocol=TCP,ipaddress=192.168.12.154,port=4370,timeout=2000,passwd=";



Если твоя функция Connect() не меняет параметр, то так можно
Код: plaintext
1.
typedef void __cdecl (*Connectos)(const char *param);


Если меняет, то сначала скопировать Parameters в массив char[] затем давать указатель на массив.
...
Рейтинг: 0 / 0
08.06.2017, 13:49
    #39468609
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с вызовом функции DLL
Mizerчто делаю не так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
String Worda = "plcommpro.dll";
	wchar_t* plcommpro = Worda.w_str();
	hDLL = LoadLibrary(plcommpro);
	if (!hDLL) {
	  ShowMessage("Невозможно загрузить plcommpro.dll");
	  return;
	}
	typedef void __cdecl (*Connectos)(char *param);
	Connectos Connecto = (Connectos)GetProcAddress(hDLL, "Connect");
	const char *Parameters = "protocol=TCP,ipaddress=192.168.12.154,port=4370,timeout=2000,passwd=";
	int h = Connecto(Parameters);




на строку int h = Connecto(Parameters);
ругается [bcc32 Error] Unit3.cpp(46): E2034 Cannot convert 'const char *' to 'char *'

не могу их соединитьУчи матчасть, лодырь!
Лезем в plcdemo пакета ZKTeco PullSDK и видим:
Код: c#
1.
2.
3.
4.
[DllImport("C:\\WINDOWS\\system32\\plcommpro.dll", EntryPoint = "Connect")]
public static extern IntPtr Connect(string Parameters);
[DllImport("plcommpro.dll", EntryPoint = "PullLastError")]
public static extern int PullLastError();

что библиотечная функция объявлена, как функция с неуправляемым кодом и соглашением вызова по умолчанию для C# - __stdcall , а не __cdecl. Также в plcdemo видим, что функция Connect возвращает некий handle. Соответственно, должно быть:
Код: plaintext
1.
typedef void (__stdcall *Connect)(const char* param);
...
Рейтинг: 0 / 0
08.06.2017, 13:51
    #39468612
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с вызовом функции DLL
Код: plaintext
1.
typedef void* (__stdcall *Connect)(const char* param);


или
Код: plaintext
1.
typedef int (__stdcall *Connect)(const char* param);
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите с вызовом функции DLL / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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