powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
15 сообщений из 15, страница 1 из 1
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993062
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходное определение из доков такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
typedef struct _MODE_STATUS {
    BYTE ModeId;
    bool IsRegistered,
    	 IsKeyPresent,
    	 IsWrongHardwareID,
    	 IsKeyExpired,
    	 IsModeExpired,
    	 IsBlackListedKey,
    	 IsModeActivated;
}MODE_STATUS, *PMODE_STATUS;

 extern "C" BOOL  __stdcall CheckKey( char* Key, char* Name, PMODE_STATUS mode_status );



Я декларирую свою API так
(воспользоваться исходной сразу из .Net не могу, т.к. .Net файлы не прошиваются защитой, при которой исходные API работают)
Код: plaintext
1.
2.
3.
4.
BOOL __stdcall CPP7_Check_LicenseKey(char* Key, char* Name, PMODE_STATUS ModeStatus)
{ 
  return CheckKey(Key, Name, ModeStatus);
}


Вроде все компилируется.

Использовать пытаюсь так:

Код: vbnet
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.
 <StructLayout(LayoutKind.Sequential)>
  Public Structure MODE_STATUS
    Dim ModeId As Byte
    Dim IsRegistered As Boolean
    Dim IsKeyPresent As Boolean
    Dim IsWrongHardwareID As Boolean
    Dim IsKeyExpired As Boolean
    Dim IsModeExpired As Boolean
    Dim IsBlackListedKey As Boolean
    Dim IsModeActivated As Boolean
  End Structure

  Public Declare Function CPP7_Check_LicenseKey Lib "License.dll" _
   (ByVal Key As String, ByVal Name As String, ByRef ModeStatus As MODE_STATUS) As Boolean

  Private Sub ButtonCheckKey_Click(sender As Object, e As EventArgs) Handles ButtonCheckKey.Click
    Dim m_ModeStatus As MODE_STATUS
    Dim ValidKey As Boolean
    ValidKey = CPP7_Check_LicenseKey(TextBoxKey.Text, TextBoxName.Text, m_ModeStatus)
    Dim str As String
    str = "ValidKey: " & ValidKey & vbCrLf & _
    "ModeId: " & m_ModeStatus.ModeId & vbCrLf & _
    "IsRegistered: " & m_ModeStatus.IsRegistered & vbCrLf & _
    "IsKeyPresent: " & m_ModeStatus.IsKeyPresent & vbCrLf & _
    "IsWrongHardwareID: " & m_ModeStatus.IsWrongHardwareID & vbCrLf & _
    "IsKeyExpired: " & m_ModeStatus.IsKeyExpired & vbCrLf & _
    "IsModeExpired: " & m_ModeStatus.IsModeExpired & vbCrLf & _
    "IsBlackListedKey: " & m_ModeStatus.IsBlackListedKey & vbCrLf & _
    "IsModeActivated: " & m_ModeStatus.IsModeActivated
    MsgBox(str)
  End Sub



Что получается:
ModeId As Byte -возвращает правильно
Первый Boolean IsRegistered As Boolean -тоже вроде как правильно

А вот остальные Boolean (что ниже первого начиная с IsKeyPresent) -всегда False,
что не соответствует действительности, пробовал генерировать ключи для неправильных HardwareID и с истекшим сроком.

Где накосячил?
Либо PMODE_STATUS на стороне C/C++ не так передаю,
либо со структурой на стороне VB.Net накосячил.

Честно, мне не ясно почему после BYTE ModeId; стоит точка с запятой,
а bool один раз и между остальными параметрами запятые, по идее структуру в VB вроде правильно написал.

М.б. конечно разработчики исходной ф-ции накосячили...
Примеров по этой ф-ции даже для VB6 что-то не видно.
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993072
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Где накосячил?
Какой размер у Boolean в VB и у bool в С?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993073
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел таки в примерах для VB6 определения:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Type TModeStatus
    ModeID               As Byte
    IsRegistered         As Boolean
    IsKeyPresent         As Boolean
    IsWrongHardwareID    As Boolean
    IsKeyExpired         As Boolean
    IsModeExpired        As Boolean
    IsBlackListedKey     As Boolean
    IsModeActivated      As Boolean
End Type

Declare Function apiCheckKey Lib "aspr_ide.dll" Alias "CheckKey" (ByVal Key As String, ByVal Name As String, ByRef ModeStatus As TModeStatus) As Boolean



Так что если где-то и накосячил, то здесь:
Код: plaintext
1.
2.
3.
4.
BOOL __stdcall CPP7_Check_LicenseKey(char* Key, char* Name, PMODE_STATUS ModeStatus)
{ 
  return CheckKey(Key, Name, ModeStatus);
}



Мож какие * -ки и/ли & -ды для ModeStatus понаставить, туплю(С)
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993075
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДмитрий77Где накосячил?
Какой размер у Boolean в VB и у bool в С?

Намекаешь на то что в C все 7 параметров в единственный байт запихнуты?
Ну, может тогда тупо ByRef все эти 7 параметров возвращать по отдельности, без структуры в VB.Net?
Раскладывая на стороне C?

В .Net наверно как-то можно извернуться, но рука особо не набита.
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993080
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Намекаешь на то что в C все 7 параметров в единственный байт запихнуты?

Нет, на стороне С они как раз каждый в своём байте. А вот какая двоичная раскладка у твоей
структур в VB - мне неизвестно. Выведи её суммарный размер и сравни с размером этой же
структуры в С.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993093
locked
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77Dimitry Sibiryakovпропущено...

Какой размер у Boolean в VB и у bool в С?

Намекаешь на то что в C все 7 параметров в единственный байт запихнуты?
Намекает на то что размер bool не определен стандартом и зависит от имплементации.
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993187
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче вопрос решается на стороне .Net:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  <StructLayout(LayoutKind.Sequential)>
  Public Structure MODE_STATUS
    Dim ModeId As Byte
    <MarshalAs(UnmanagedType.I1)> Dim IsRegistered As Boolean
    <MarshalAs(UnmanagedType.I1)> Dim IsKeyPresent As Boolean
    <MarshalAs(UnmanagedType.I1)> Dim IsWrongHardwareID As Boolean
    <MarshalAs(UnmanagedType.I1)> Dim IsKeyExpired As Boolean
    <MarshalAs(UnmanagedType.I1)> Dim IsModeExpired As Boolean
    <MarshalAs(UnmanagedType.I1)> Dim IsBlackListedKey As Boolean
    <MarshalAs(UnmanagedType.I1)> Dim IsModeActivated As Boolean
  End Structure



https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype(v=vs.80).aspx

I1 A 1-byte signed integer. You can use this member to transform a Boolean value into a 1-byte, C-style bool (true = 1, false = 0).

Добрый человек подсказал .

Что до VB6 такое по простому видимо не сделаешь, но оно и не надо,
т.к. 1) в VB6 работают исходные API без c-dll (.Net файлы не прошиваются защитой) 2) мне нужен именно .Net
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993254
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry

bool в С нет
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993260
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Я не знаю.
Ты ж знаешь что я не спец по вашему языку.

Вот полный файл из AsProtect32 Sky который они дают.
В структуре bool маленькими буквами.
Код: 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.
// aspr_api.h : Defines API functions.
//

#ifndef ASPR_API_H
#define ASPR_API_H

// Mode status

typedef struct _MODE_STATUS {
    BYTE ModeId;
    bool IsRegistered,
    	 IsKeyPresent,
    	 IsWrongHardwareID,
    	 IsKeyExpired,
    	 IsModeExpired,
    	 IsBlackListedKey,
    	 IsModeActivated;
}MODE_STATUS, *PMODE_STATUS;

#ifdef __BORLANDC__

 extern "C"  char*   __declspec(dllimport) _stdcall GetRegistrationKeys();
 extern "C" _stdcall __declspec(dllimport) BOOL GetRegistrationInformation( BYTE ModeId, char** Key, char** Name);
 extern "C" _stdcall __declspec(dllimport) BOOL RemoveKey( BYTE ModeId );
 extern "C" _stdcall __declspec(dllimport) BOOL CheckKey( char* Key, char* Name, PMODE_STATUS mode_status );
 extern "C" _stdcall __declspec(dllimport) BOOL CheckKeyAndDecrypt( char* Key, char* Name, BOOL SaveKey );
 extern "C" _stdcall __declspec(dllimport) BOOL GetKeyDate( BYTE ModeId, WORD* Day, WORD* Month, WORD* Year );
 extern "C" _stdcall __declspec(dllimport) BOOL GetKeyExpirationDate( BYTE ModeId, WORD* Day, WORD* Month, WORD* Year );
 extern "C" _stdcall __declspec(dllimport) BOOL GetTrialDays( BYTE ModeId, DWORD* Total, DWORD* Left );
 extern "C" _stdcall __declspec(dllimport) BOOL GetTrialExecs( BYTE ModeId, DWORD* Total, DWORD* Left );
 extern "C" _stdcall __declspec(dllimport) BOOL GetExpirationDate( BYTE ModeId, WORD* Day, WORD* Month, WORD* Year );
 extern "C" _stdcall __declspec(dllimport) BOOL GetModeInformation( BYTE ModeID, char** ModeName, PMODE_STATUS mode_status);
 extern "C"  char*   __declspec(dllimport) _stdcall GetHardwareID();
 extern "C"  char*   __declspec(dllimport) _stdcall GetHardwareIDEx( BYTE ModeID );
 extern "C" _stdcall __declspec(dllimport) BOOL SetUserKey( char* Key, DWORD KeySize );

#else

 extern "C" char* __stdcall GetRegistrationKeys();
 extern "C" BOOL  __stdcall GetRegistrationInformation( BYTE ModeId, char** Key, char** Name);
 extern "C" BOOL  __stdcall RemoveKey( BYTE ModeId );
 extern "C" BOOL  __stdcall CheckKey( char* Key, char* Name, PMODE_STATUS mode_status );
 extern "C" BOOL  __stdcall CheckKeyAndDecrypt( char* Key, char* Name, BOOL SaveKey );
 extern "C" BOOL  __stdcall GetKeyDate( BYTE ModeId, WORD* Day, WORD* Month, WORD* Year );
 extern "C" BOOL  __stdcall GetKeyExpirationDate( BYTE ModeId, WORD* Day, WORD* Month, WORD* Year );
 extern "C" BOOL  __stdcall GetTrialDays( BYTE ModeId, DWORD* Total, DWORD* Left );
 extern "C" BOOL  __stdcall GetTrialExecs( BYTE ModeId, DWORD* Total, DWORD* Left );
 extern "C" BOOL  __stdcall GetExpirationDate( BYTE ModeId, WORD* Day, WORD* Month, WORD* Year );
 extern "C" BOOL  __stdcall GetModeInformation( BYTE ModeID, char** ModeName, PMODE_STATUS mode_status);
 extern "C" char* __stdcall GetHardwareID();
 extern "C" char* __stdcall GetHardwareIDEx( BYTE ModeID );
 extern "C" BOOL  __stdcall SetUserKey( char* Key, DWORD KeySize );

#endif

#endif



но есть еще
Код: plaintext
1.
#pragma comment(lib,"include/aspr_ide.lib")


мож оно там где-то сидит.

Короче заработало и чудненько.
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993377
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivbool в С нетесть же, вроде, давно уже ввели.
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38993849
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychMasterZivbool в С нетесть же, вроде, давно уже ввели.В С++ есть. В Си - нету.
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38994069
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychMasterZivbool в С нетесть же, вроде, давно уже ввели.

Там boolean. Или Bool. не помню даже.
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38994083
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в WINAPI
Код: plaintext
1.
typedef int BOOL;
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38994196
Занудный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В C есть тип _Bool и заголовок stdbool.h с макросами: bool, true, false
...
Рейтинг: 0 / 0
Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
    #38994204
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗанудныйВ C есть тип _Bool и заголовок stdbool.h с макросами: bool, true, falseНе путай типы определенные в языке с макросами определенными в стандартной библиотеке.
И будет тебе щастье и будешь знать что _Bool уже никто давно не использует.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Делаю свою API на базе другой API, чтоб воспользоваться из .Net,и структура не заполняется
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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