Исходное определение из доков такое:
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 работают)
BOOL __stdcall CPP7_Check_LicenseKey(char* Key, char* Name, PMODE_STATUS ModeStatus)
{
return CheckKey(Key, Name, ModeStatus);
}
Вроде все компилируется.
Использовать пытаюсь так:
<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 что-то не видно.