powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование сторонней библиотеки
9 сообщений из 9, страница 1 из 1
Использование сторонней библиотеки
    #39421556
Keremet2030
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые обитатели форума!

Прошу прощения за дублирование темы, но предыдущая перешла из раздела Delphi
В общем задача у меня такая:
1) Имеется видеорегистратор Wolfcom Vision. При подключении устройства определяется как libusb-win32 drivers\Wolfcom Vision Driver 1.2.3.0
2) Существует ПО для управления этим видеорегистратором, и в этом ПО есть кнопочка Connect Device, которая посылает некую команда в устройство, после чего оно переходит в режим накопителя, и начинает определяться как обычная флешка.
3) Задача: Написать программку, которая смогла бы отправить эту команду.

Вместе с родным ПО идут библиотеки libusb0.dll и PW01_func.dll. Про libusb0 я понял и нашел warper для Delphi, пробовал захватывать и анализировать трафик через USBcap.exe и Wireshark, чтобы узнать какую команду он отправляет, но не смог разобраться...
Но потом поковыряв PW01_func я понял, что эта как раз та библиотека, что используется для отправки команд устройству. Попробовал экспортировать dll в Delphi через Components\Export Type Lib но оно выдает ошибку...
- Нашел способ как вытащить имена функций, и вызывать их из Delphi, но оно выдаёт ошибки Accses...
- С помощью IDA вытянул таблицу импорта:
.idata:00406368 ; Imports from PW01_func.dll
.idata:00406368 ;
.idata:00406368 ; public: int __thiscall CPW01_Device::GetDeviceSerialNo(unsigned char *, int)
.idata:00406368 extrn ?GetDeviceSerialNo@CPW01_Device@@QAEHPAEH@Z:dword
.idata:00406368 ; DATA XREF: sub_404450+E7r
.idata:0040636C ; public: int __thiscall CPW01_Device::GetDeviceSetup(unsigned char *, int)
.idata:0040636C extrn ?GetDeviceSetup@CPW01_Device@@QAEHPAEH@Z:dword
.idata:0040636C ; DATA XREF: sub_404450+142r
.idata:00406370 ; public: __thiscall CPW01_DevSearch::CPW01_DevSearch(unsigned long *)
.idata:00406370 extrn ??0CPW01_DevSearch@@QAE@PAK@Z:dword
.idata:00406370 ; DATA XREF: sub_403E20+2Fr
.idata:00406374 ; public: void __thiscall CPW01_DevSearch::EnumerateHostControllers(void)
.idata:00406374 extrn ?EnumerateHostControllers@CPW01_DevSearch@@QAEXXZ:dword
.idata:00406374 ; DATA XREF: sub_403E20+44r
.idata:00406378 ; public: int __thiscall CPW01_Device::GetDevicePassword(unsigned char *, int)
.idata:00406378 extrn ?GetDevicePassword@CPW01_Device@@QAEHPAEH@Z:dword
.idata:00406378 ; DATA XREF: sub_403E20+ABr
.idata:0040637C ; public: virtual __thiscall CPW01_DevSearch::~CPW01_DevSearch(void)
.idata:0040637C extrn ??1CPW01_DevSearch@@UAE@XZ:dword
.idata:0040637C ; DATA XREF: sub_403E20+134r
.idata:0040637C ; sub_403E20+16Ar ...
.idata:00406380 ; public: int __thiscall CPW01_Device::SetDeviceMassStorage(void)
.idata:00406380 extrn ?SetDeviceMassStorage@CPW01_Device@@QAEHXZ:dword
.idata:00406380 ; DATA XREF: sub_403D40+5Er
.idata:00406384 ; public: int __thiscall CPW01_Device::IsDevicePlugin(void)
.idata:00406384 extrn ?IsDevicePlugin@CPW01_Device@@QAEHXZ:dword
.idata:00406384 ; DATA XREF: sub_403720+32r
.idata:00406384 ; sub_403D40+36r ...
.idata:00406388 ; public: int __thiscall CPW01_Device::SetDevicePassword(class CString)
.idata:00406388 extrn ?SetDevicePassword@CPW01_Device@@QAEHVCString@@@Z:dword
.idata:00406388 ; DATA XREF: sub_403720+DBr
.idata:00406388 ; sub_404620+8Ar
.idata:0040638C ; public: int __thiscall CPW01_Device::SetDevicePoliceNo(class CString)
.idata:0040638C extrn ?SetDevicePoliceNo@CPW01_Device@@QAEHVCString@@@Z:dword
.idata:0040638C ; DATA XREF: sub_403720+216r
.idata:00406390 ; public: int __thiscall CPW01_Device::SetDeviceSetup(class CString)
.idata:00406390 extrn ?SetDeviceSetup@CPW01_Device@@QAEHVCString@@@Z:dword
.idata:00406390 ; DATA XREF: sub_403720+5A8r
.idata:00406394 ; public: __thiscall CPW01_Device::CPW01_Device(void)
.idata:00406394 extrn ??0CPW01_Device@@QAE@XZ:dword
.idata:00406394 ; DATA XREF: sub_403680+1Cr
.idata:00406394 ; sub_403720+22r ...
.idata:00406398 ; public: int __thiscall CPW01_Device::SetDeviceTime(void)
.idata:00406398 extrn ?SetDeviceTime@CPW01_Device@@QAEHXZ:dword
.idata:00406398 ; DATA XREF: sub_403680+2Er
.idata:00406398 ; sub_403720+120r
.idata:0040639C ; public: virtual __thiscall CPW01_Device::~CPW01_Device(void)
.idata:0040639C extrn ??1CPW01_Device@@UAE@XZ:dword
.idata:0040639C ; DATA XREF: sub_403680+40r
.idata:0040639C ; sub_403720+604r ...
.idata:004063A0 ; public: int __thiscall CPW01_Device::GetDevicePoliceNo(unsigned char *, int)
.idata:004063A0 extrn ?GetDevicePoliceNo@CPW01_Device@@QAEHPAEH@Z:dword
.idata:004063A0 ; DATA XREF: sub_404450+8Cr

Выяснилось, что библиотека использует __thiscall, и из Delphi её неправильно вызывать, так как delphi не умеет __thiscall...
- С помощью IDA и HEX-Reys декомпилировал родное ПО, вот несколько функций, которые мне нужны. Только не могу сообразить как это работает...
Код: 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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
int __thiscall sub_403E20(CWnd *this, int a2, int a3)
{
  CWnd *v3; // esi@1
  int v4; // eax@4
  int result; // eax@7
  int v6; // [sp+8h] [bp-A4h]@1
  char v7; // [sp+Ch] [bp-A0h]@4
  char v8; // [sp+14h] [bp-98h]@1
  char v9; // [sp+28h] [bp-84h]@4
  char v10; // [sp+3Ch] [bp-70h]@4
  char v11; // [sp+9Ch] [bp-10h]@4
  int v12; // [sp+A8h] [bp-4h]@1

  v3 = this;
  v6 = 1112866817;
  CPW01_DevSearch::CPW01_DevSearch(&v8, &v6);
  v12 = 0;
  CPW01_DevSearch::EnumerateHostControllers((CPW01_DevSearch *)&v8);
  if ( v6 )
  {
    if ( dword_409664 )
    {
      dword_409664 = 0;
      CWnd::ShowWindow(v3, 0);
    }
    v12 = -1;
    CPW01_DevSearch::~CPW01_DevSearch((CPW01_DevSearch *)&v8);
    result = 0;
  }
  else
  {
    Sleep(0x1F4u);
    sub_404450((void *)v3);
    if ( *((_DWORD *)v3 + 428) )
    {
      if ( !dword_409664 )
      {
        dword_409664 = 1;
        CPW01_Device::CPW01_Device(&v7);
        LOBYTE(v12) = 1;
        v4 = CPW01_Device::GetDevicePassword((CPW01_Device *)&v7, (unsigned __int8 *)&v9, 20);
        sub_4028C0(&v10, (int)&v9, v4);
        LOBYTE(v12) = 2;
        CDialog::DoModal((CDialog *)&v10);
        LOBYTE(v12) = 3;
        CString::~CString((CString *)&v11);
        LOBYTE(v12) = 1;
        CDialog::~CDialog((CDialog *)&v10);
        LOBYTE(v12) = 0;
        CPW01_Device::~CPW01_Device((CPW01_Device *)&v7);
      }
    }
    else if ( !*((_DWORD *)v3 + 429) )
    {
      *((_DWORD *)v3 + 429) = 1;
      CWnd::SetWindowPlacement(v3, &stru_409628);
    }
    v12 = -1;
    CPW01_DevSearch::~CPW01_DevSearch((CPW01_DevSearch *)&v8);
    result = 1;
  }
  return result;
}
// 406370: using guessed type int __thiscall CPW01_DevSearch::CPW01_DevSearch(_DWORD, _DWORD);
// 406374: using guessed type void __thiscall CPW01_DevSearch::EnumerateHostControllers(CPW01_DevSearch *__hidden this);
// 406378: using guessed type _DWORD __thiscall CPW01_Device::GetDevicePassword(CPW01_Device *__hidden this, unsigned __int8 *, _DWORD);
// 40637C: using guessed type _DWORD __thiscall CPW01_DevSearch::~CPW01_DevSearch(CPW01_DevSearch *__hidden this);
// 406394: using guessed type int __thiscall CPW01_Device::CPW01_Device(_DWORD);
// 40639C: using guessed type _DWORD __thiscall CPW01_Device::~CPW01_Device(CPW01_Device *__hidden this);
// 409664: using guessed type int dword_409664;

//----- (00403FB0) --------------------------------------------------------
int __thiscall sub_404450(void *this)
{
  int v1; // esi@1
  int v2; // eax@1
  char *v3; // ecx@1
  int v4; // eax@3
  int v5; // eax@4
  int v6; // eax@5
  char *v8; // [sp+Ch] [bp-3Ch]@1
  char v9; // [sp+18h] [bp-30h]@1
  char **v10; // [sp+1Ch] [bp-2Ch]@2
  char v11; // [sp+20h] [bp-28h]@1
  char v12[20]; // [sp+28h] [bp-20h]@3
  int v13; // [sp+44h] [bp-4h]@1

  v1 = (int)this;
  CString::CString(&v9);
  v13 = 0;
  sub_403590(v1);
  CPW01_Device::CPW01_Device(&v11);
  LOBYTE(v13) = 1;
  v2 = CPW01_Device::IsDevicePlugin((CPW01_Device *)&v11);
  v8 = v3;
  if ( v2 )
  {
    v10 = &v8;
    CString::CString(&v8, aConnectedToDev);
    sub_4035B0(v1, (int)v8);
    v4 = CPW01_Device::GetDevicePoliceNo((CPW01_Device *)&v11, (unsigned __int8 *)v12, 20);
    if ( v4 > 0 )
    {
      v12[v4] = 0;
      CWnd::SetWindowTextA((CWnd *)(v1 + 1516), v12);
      v8 = v12;
      CString::Format((CString *)&v9, aPoliceIdIsS);
      v10 = &v8;
      CString::CString(&v8, &v9);
      sub_4035B0(v1, (int)v8);
      v5 = CPW01_Device::GetDeviceSerialNo((CPW01_Device *)&v11, (unsigned __int8 *)v12, 20);
      if ( v5 > 0 )
      {
        v12[v5] = 0;
        CWnd::SetWindowTextA((CWnd *)(v1 + 1580), v12);
        v8 = v12;
        CString::Format((CString *)&v9, aDeviceIdIsS);
        v10 = &v8;
        CString::CString(&v8, &v9);
        sub_4035B0(v1, (int)v8);
        v6 = CPW01_Device::GetDeviceSetup((CPW01_Device *)&v11, (unsigned __int8 *)v12, 20);
        if ( v6 > 0 )
        {
          v8 = v12;
          v12[v6] = 0;
          CString::Format((CString *)&v9, aDeviceSetupIsS);
          v10 = &v8;
          CString::CString(&v8, &v9);
          sub_4035B0(v1, (int)v8);
          sub_403FB0((void *)v1, (int)v12);
          *(_DWORD *)(v1 + 1712) = v12[0] - 48;
        }
      }
    }
  }
  else
  {
    v10 = &v8;
    CString::CString(&v8, aNoFindDevice_);
    sub_4035B0(v1, (int)v8);
  }
  LOBYTE(v13) = 0;
  CPW01_Device::~CPW01_Device((CPW01_Device *)&v11);
  v13 = -1;
  return CString::~CString((CString *)&v9);
}
// 404D76: using guessed type int __thiscall CString::CString(_DWORD);
// 404D94: using guessed type int __thiscall CString::CString(_DWORD, _DWORD);
// 404FC8: using guessed type int __thiscall CString::CString(_DWORD, _DWORD);
// 406368: using guessed type _DWORD __thiscall CPW01_Device::GetDeviceSerialNo(CPW01_Device *__hidden this, unsigned __int8 *, _DWORD);
// 40636C: using guessed type _DWORD __thiscall CPW01_Device::GetDeviceSetup(CPW01_Device *__hidden this, unsigned __int8 *, _DWORD);
// 406384: using guessed type _DWORD __thiscall CPW01_Device::IsDevicePlugin(CPW01_Device *__hidden this);
// 406394: using guessed type int __thiscall CPW01_Device::CPW01_Device(_DWORD);
// 40639C: using guessed type _DWORD __thiscall CPW01_Device::~CPW01_Device(CPW01_Device *__hidden this);
// 4063A0: using guessed type _DWORD __thiscall CPW01_Device::GetDevicePoliceNo(CPW01_Device *__hidden this, unsigned __int8 *, _DWORD);
// 404450: using guessed type char var_20[20];


- Сейчас пробую писать свою библиотеку, которая будет вызывать нужную:
Код: 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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
// WolfComDriver.cpp: определяет экспортированные функции для приложения DLL.
//

#include "stdafx.h"
#include <sys/stat.h>
#include <stdio.h>


HMODULE lib;
typedef void(__thiscall *CPW01_DevSearchF) (unsigned long *);
typedef void(__thiscall *EnumerateHostControllersF) (void);
typedef void(__thiscall *CPW01_DeviceF) (void);
typedef int(__thiscall *IsDevicePluginF) (void);
typedef int(__thiscall *SetDeviceMassStorageF) (void);

CPW01_DevSearchF CPW01_DevSearch;
EnumerateHostControllersF EnumerateHostControllers;
CPW01_DeviceF CPW01_Device;
IsDevicePluginF IsDevicePlugin;
SetDeviceMassStorageF SetDeviceMassStorage;

int exist(char *name)
{
	struct stat   buffer;
	return (stat(name, &buffer) == 0);
}

BOOL  ConnectAllDevice()
{
	char err_msg[10];
	if (exist("PW01_func.dll"))
	{
		lib = LoadLibrary("PW01_func.dll");
	}
	else
	{
		
		OutputDebugString("File PW01_func.dll not found!");
		return FALSE;
	}
	

	if (!lib) {
		OutputDebugString("Could not load PW01_func.dll library");
		sprintf_s(err_msg, "%d", GetLastError());
		OutputDebugString("\n");
		OutputDebugString(err_msg);
		return FALSE;
	}

	CPW01_DevSearch = (CPW01_DevSearchF)GetProcAddress(lib, "??0CPW01_DevSearch@@QAE@PAK@Z");
	if (!CPW01_DevSearch) {
		OutputDebugString("Could not locate the function CPW01_DevSearch");
		sprintf_s(err_msg, "%d", GetLastError());
		OutputDebugString(err_msg);
		return FALSE;
	}

	EnumerateHostControllers = (EnumerateHostControllersF)GetProcAddress(lib, "?EnumerateHostControllers@CPW01_DevSearch@@QAEXXZ");
	if (!EnumerateHostControllers) {
		OutputDebugString("Could not locate the function EnumerateHostControllers");
		sprintf_s(err_msg, "%d", GetLastError());
		OutputDebugString("/n");
		OutputDebugString(err_msg);
		return FALSE;
	}

	CPW01_Device = (CPW01_DeviceF)GetProcAddress(lib, "??0CPW01_Device@@QAE@XZ");
	if (!CPW01_Device) {
		OutputDebugString("Could not locate the function CPW01_Device");
		sprintf_s(err_msg, "%d", GetLastError());
		OutputDebugString(err_msg);
		return FALSE;
	}

	IsDevicePlugin = (IsDevicePluginF)GetProcAddress(lib, "?IsDevicePlugin@CPW01_Device@@QAEHXZ");
	if (!IsDevicePlugin) {
		OutputDebugString("Could not locate the function IsDevicePlugin");
		sprintf_s(err_msg, "%d", GetLastError());
		OutputDebugString(err_msg);
		return FALSE;
	}

	SetDeviceMassStorage = (SetDeviceMassStorageF)GetProcAddress(lib, "?SetDeviceMassStorage@CPW01_Device@@QAEHXZ");
	if (!SetDeviceMassStorage) {
		OutputDebugString("Could not locate the function SetDeviceMassStorage");
		sprintf_s(err_msg, "%d", GetLastError());
		OutputDebugString(err_msg);
		return FALSE;
	}
	unsigned long * DevID;
	DevID = 0;
	CPW01_DevSearch(DevID);
	EnumerateHostControllers;
	CPW01_Device;
	IsDevicePlugin;
	SetDeviceMassStorage;


	return TRUE;
}

extern "C" __declspec(dllexport) char *PluginName();
extern "C" __declspec(dllexport) char *PluginName()
{
	return ("WolfCom Vision Driver");
}

extern "C" __declspec(dllexport) char *PluginVersion();
extern "C" __declspec(dllexport) char *PluginVersion()
{
	return ("1.01");
}

extern "C" __declspec(dllexport) char *PluginType();
extern "C" __declspec(dllexport) char *PluginType()
{
	return ("DEVICE_CONTROL");
}

extern "C" __declspec(dllexport) char *PluginDescription();
extern "C" __declspec(dllexport) char *PluginDescription()
{
	return ("Плагин для поиска и подключения к ПК видеорегистраторов WolfCom Vision");
}

extern "C" __declspec(dllexport) BOOL PluginExec();
extern "C" __declspec(dllexport) BOOL PluginExec()
{
	ConnectAllDevice();
	return true;
}


Но опять же получаю лишь исключение: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000008.

Подскажите пожалуйста, где я ошибаюсь, и в какую сторону мне копать...
На всякий случай прикрепляю библиотеки и исходники полученные в IDA
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39421574
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keremet2030Подскажите пожалуйста, где я ошибаюсь, и в какую сторону мне копать...

Копать в сторону не инициализированных указателей на объекты. Адрес, по которому
происходит исключение, в сочетании с map и особенно call stack сделает копание простым и
быстрым.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39421580
Keremet2030
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovKeremet2030Подскажите пожалуйста, где я ошибаюсь, и в какую сторону мне копать...

Копать в сторону не инициализированных указателей на объекты. Адрес, по которому
происходит исключение, в сочетании с map и особенно call stack сделает копание простым и
быстрым.

А можно поподробнее, киньте в меня пару ссылок, или не затруднит ли Вас написать мааааленький пример. Я с VS знаком совсем недавно...
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39421719
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keremet2030,
не туда вы куда-то полезли с GetProcAddress...
Достаете из dll список экспорта, делаете .def файл - ну вот такой
Код: 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.
EXPORTS 
??0CPW01_DevSearch@@QAE@ABV0@@Z 
??0CPW01_DevSearch@@QAE@PAK@Z 
??0CPW01_Device@@QAE@ABV0@@Z 
??0CPW01_Device@@QAE@XZ 
??1CPW01_DevSearch@@UAE@XZ 
??1CPW01_Device@@UAE@XZ 
??4CPW01_DevSearch@@QAEAAV0@ABV0@@Z 
??4CPW01_Device@@QAEAAV0@ABV0@@Z 
??_7CPW01_DevSearch@@6B@ 
??_7CPW01_Device@@6B@ 
?EnumerateHostController@CPW01_DevSearch@@IAEXXZ 
?EnumerateHostControllers@CPW01_DevSearch@@QAEXXZ 
?EnumerateHub@CPW01_DevSearch@@IAEXVCString@@PAU_USB_NODE_CONNECTION_INFORMATION@@PAD@Z 
?EnumerateHubPorts@CPW01_DevSearch@@IAEXPAXK@Z 
?GetDeviceContext@CPW01_Device@@AAEHEPAEH@Z 
?GetDeviceFile@CPW01_Device@@QAEHHPAX0_KP6GK110@Z@Z 
?GetDeviceFileList@CPW01_Device@@QAEHPAUFF_STAT@@H@Z 
?GetDevicePassword@CPW01_Device@@QAEHPAEH@Z 
?GetDevicePoliceNo@CPW01_Device@@QAEHPAEH@Z 
?GetDeviceSerialNo@CPW01_Device@@QAEHPAEH@Z 
?GetDeviceSetup@CPW01_Device@@QAEHPAEH@Z 
?GetDeviceTotalFiles@CPW01_Device@@QAEHXZ 
?GetExternalHubName@CPW01_DevSearch@@IAE?AVCString@@PAXK@Z 
?GetRootHubName@CPW01_DevSearch@@IAE?AVCString@@PAX@Z 
?InitUsbDevice@CPW01_Device@@QAEHXZ 
?IsDevicePlugin@CPW01_Device@@QAEHXZ 
?SetDeviceFileFormat@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceGPS@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceMassStorage@CPW01_Device@@QAEHXZ 
?SetDevicePassword@CPW01_Device@@QAEHVCString@@@Z 
?SetDevicePoliceNo@CPW01_Device@@QAEHVCString@@@Z 
?SetDevicePoweroff@CPW01_Device@@QAEHXZ 
?SetDeviceSerialNo@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceSetup@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceTime@CPW01_Device@@QAEHXZ 
?SetupDevice@CPW01_Device@@AAEHEVCString@@@Z 
?WideStrToMultiStr@CPW01_DevSearch@@IAE?AVCString@@PAG@Z 
?bulk_recv@CPW01_Device@@AAEHPAEH@Z 
?bulk_send@CPW01_Device@@AAEHPAEH@Z 
?setup_A1@CPW01_Device@@AAEXPAUusb_device@@PAUusb_dev_handle@@@Z 
генерируете .lib как-то так:
Код: plaintext
lib /def:PW01_func.def /out:PW01_func.lib
пишите в test.cpp что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct CPW01_Device {
  CPW01_Device();
  int IsDevicePlugin();
  int SetDeviceMassStorage();
  virtual ~CPW01_Device();
};

int main() {
  CPW01_Device  *d = new CPW01_Device();
  if ( d->IsDevicePlugin() )
    d->SetDeviceMassStorage();

  return 0;
}

компилируете
Код: plaintext
cl test.cpp PW01_func.lib
и проверяете, что из этого получилось...
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39421903
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так конечно нехорошо, размер объекта то мы не знаем, и память под него не выделится. Ну можно что-нибудь фиктивное с запасом нарисовать
Код: plaintext
1.
2.
3.
4.
struct CPW01_Device {
  char dummy[2048];
  CPW01_Device();
...
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39422035
Keremet2030
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarloneKeremet2030,
не туда вы куда-то полезли с GetProcAddress...
Достаете из dll список экспорта, делаете .def файл - ну вот такой
Код: 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.
EXPORTS 
??0CPW01_DevSearch@@QAE@ABV0@@Z 
??0CPW01_DevSearch@@QAE@PAK@Z 
??0CPW01_Device@@QAE@ABV0@@Z 
??0CPW01_Device@@QAE@XZ 
??1CPW01_DevSearch@@UAE@XZ 
??1CPW01_Device@@UAE@XZ 
??4CPW01_DevSearch@@QAEAAV0@ABV0@@Z 
??4CPW01_Device@@QAEAAV0@ABV0@@Z 
??_7CPW01_DevSearch@@6B@ 
??_7CPW01_Device@@6B@ 
?EnumerateHostController@CPW01_DevSearch@@IAEXXZ 
?EnumerateHostControllers@CPW01_DevSearch@@QAEXXZ 
?EnumerateHub@CPW01_DevSearch@@IAEXVCString@@PAU_USB_NODE_CONNECTION_INFORMATION@@PAD@Z 
?EnumerateHubPorts@CPW01_DevSearch@@IAEXPAXK@Z 
?GetDeviceContext@CPW01_Device@@AAEHEPAEH@Z 
?GetDeviceFile@CPW01_Device@@QAEHHPAX0_KP6GK110@Z@Z 
?GetDeviceFileList@CPW01_Device@@QAEHPAUFF_STAT@@H@Z 
?GetDevicePassword@CPW01_Device@@QAEHPAEH@Z 
?GetDevicePoliceNo@CPW01_Device@@QAEHPAEH@Z 
?GetDeviceSerialNo@CPW01_Device@@QAEHPAEH@Z 
?GetDeviceSetup@CPW01_Device@@QAEHPAEH@Z 
?GetDeviceTotalFiles@CPW01_Device@@QAEHXZ 
?GetExternalHubName@CPW01_DevSearch@@IAE?AVCString@@PAXK@Z 
?GetRootHubName@CPW01_DevSearch@@IAE?AVCString@@PAX@Z 
?InitUsbDevice@CPW01_Device@@QAEHXZ 
?IsDevicePlugin@CPW01_Device@@QAEHXZ 
?SetDeviceFileFormat@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceGPS@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceMassStorage@CPW01_Device@@QAEHXZ 
?SetDevicePassword@CPW01_Device@@QAEHVCString@@@Z 
?SetDevicePoliceNo@CPW01_Device@@QAEHVCString@@@Z 
?SetDevicePoweroff@CPW01_Device@@QAEHXZ 
?SetDeviceSerialNo@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceSetup@CPW01_Device@@QAEHVCString@@@Z 
?SetDeviceTime@CPW01_Device@@QAEHXZ 
?SetupDevice@CPW01_Device@@AAEHEVCString@@@Z 
?WideStrToMultiStr@CPW01_DevSearch@@IAE?AVCString@@PAG@Z 
?bulk_recv@CPW01_Device@@AAEHPAEH@Z 
?bulk_send@CPW01_Device@@AAEHPAEH@Z 
?setup_A1@CPW01_Device@@AAEXPAUusb_device@@PAUusb_dev_handle@@@Z 
генерируете .lib как-то так:
Код: plaintext
lib /def:PW01_func.def /out:PW01_func.lib
пишите в test.cpp что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct CPW01_Device {
  CPW01_Device();
  int IsDevicePlugin();
  int SetDeviceMassStorage();
  virtual ~CPW01_Device();
};

int main() {
  CPW01_Device  *d = new CPW01_Device();
  if ( d->IsDevicePlugin() )
    d->SetDeviceMassStorage();

  return 0;
}

компилируете
Код: plaintext
cl test.cpp PW01_func.lib
и проверяете, что из этого получилось...
ВЫ ГЕНИЙ!
Всё завелось с пол-пинка! Спасибо огромное за помощь!
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39422065
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneТак конечно нехорошо, размер объекта то мы не знаем, и память под него не выделится. Ну можно что-нибудь фиктивное с запасом нарисовать
Код: plaintext
1.
2.
3.
4.
struct CPW01_Device {
  char dummy[2048];
  CPW01_Device();
...

Видно размер на стеке - 16 байт
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39422776
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, а где видно? Если видно, можно правильный размер поставить. Ну больше то не страшно.
...
Рейтинг: 0 / 0
Использование сторонней библиотеки
    #39422872
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

В дизассемблере конечно.
В первой функции v8 это CPW01_DevSearch размером 14h, v7 это CPW01_Device, хм - 8 байт (в другом куске 20305653 видимо было выравнивание).

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


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