пзц побаловался :)
Добавлено: 31 Январь 2025, 10:32
Место общения программистов, форум разработчиков БД на Clarion
https://www.forum.clarionlife.net/
Код: Выделить всё
Cstr.Construct Procedure()
Code
Self.S &= New CString(1) ! Выделить память под терминатор
Self.S[1] = '<0>'
Self.Len = 0
Return
---
Код: Выделить всё
Cstr.Destruct Procedure()
Code
If Self.S <> Null
Dispose(Self.S)
Self.S &= Null
Self.Len = 0
End
Return
---
Код: Выделить всё
Cstr.Set Procedure(*CString CS)
L Long
Code
Self.Len = Len(CS)
If Self.S <> Null
Dispose(Self.S)
End
Self.S &= New CString(Self.Len + 1)
MemMove(Address(Self.S), Address(CS), Self.Len)
Self.S[Self.Len + 1] = '<0>'
Return
---
Код: Выделить всё
Cstr.Sub Procedure(Long From,<Long L>)
Code
If ~Omitted(L)
If From > Self.Len
Return Self.S[1:0]
End
If From + L - 1 > Self.Len
L = Self.Len - From + 1
End
Return Self.S[From : L]
Else
Return Self.S[From : Self.Len - From + 1]
End
---
Код: Выделить всё
Cstr.ToUTF8 Procedure()
UnicodeText &CString
UtfText &CString
L Long
Code
L = Self.Len * 2 + 2
UnicodeText &= New CString(L)
UtfText &= New CString(L)
MultiByteToWideChar(1251, 0, Address(Self.S), -1, Address(UnicodeText), L)
L = WideCharToMultiByte(65001, 0, Address(UnicodeText), -1, Address(UtfText), L, 0, 0)
Self.Set(UtfText[1 : L - 1]) ! Исключить терминатор
Dispose(UnicodeText)
Dispose(UtfText)
Return
---
Код: Выделить всё
Cstr.ToASCII Procedure()
UnicodeText &String
UtfText &String
ASCIIText &CString
Lu Long
Code
If Self.Len = 0
Return
End
Lu = Self.Len
UtfText &= New String(Lu + 2)
UnicodeText &= New String(Lu * 2 + 2)
ASCIIText &= New CString(Lu + 2)
UtfText = Self.Str()
MultiByteToWideChar(65001, 0, Address(UtfText), -1, Address(UnicodeText), Lu * 2 + 2)
WideCharToMultiByte(1251, 0, Address(UnicodeText), -1, Address(ASCIIText), Lu + 2, 0, 0)
Self.Set(ASCIIText)
Dispose(ASCIIText)
Dispose(UnicodeText)
Dispose(UtfText)
Return
---
Код: Выделить всё
Cstr.LoadFromFile Procedure(String FileName)
...
Self.S &= New Cstring(Self.Len + 1)
If Self.S = Null
Close(In)
Return(-1) ! Ошибка выделения памяти
End
...
---
Информация об ускорении чипов Nvidia в 400–800 раз обычно относится к узкоспециализированным задачам, а не к общей производительности видеокарт в играх или стандартных вычислениях. Вот основные аспекты, которые стоит учитывать:
1. Специализированные технологии
Тензорные ядра (Tensor Cores) и RT-ядра (Ray Tracing Cores) в современных GPU (например, серии RTX 40xx) оптимизированы для конкретных задач:
Искусственный интеллект (AI) и глубокое обучение: Ускорение операций вроде матричных умножений (используется в DLSS, Stable Diffusion и т.д.).
Трассировка лучей: Обработка реалистичного освещения в играх и 3D-рендеринге.
В этих сценариях прирост производительности может достигать сотен раз по сравнению с GPU без аппаратной поддержки таких технологий или с CPU.
2. Сравнение с предыдущими поколениями или CPU
Например, GPU H100 (для дата-центров) демонстрирует ускорение в 30–60 раз для обучения нейросетей по сравнению с предыдущими поколениями (A100). Однако цифры 400–800 раз могут быть получены при сравнении:
Современного GPU с CPU 10-летней давности в задачах ИИ.
При использовании оптимизированных библиотек (CUDA, TensorRT) против наивной реализации на старом железе.
3. Маркетинговый контекст
Nvidia иногда приводит максимальные значения ускорения в идеальных условиях (например, для отдельных операций или алгоритмов). В реальных приложениях прирост может быть ниже, но всё равно значительным.
4. Примеры
DLSS 3: Использует AI для апскейлинга изображения, что даёт прирост FPS в играх в 2–4 раза по сравнению с рендерингом в нативном разрешении.
Научные вычисления: Задачи в биоинформатике или физическом моделировании могут ускоряться в десятки раз благодаря CUDA и Tensor Cores.
Итог
Утверждение об ускорении в 400–800 раз — это не миф, но оно актуально только для:
Очень специфических задач (например, обучение нейросетей, рендеринг с трассировкой лучей).
Сравнения современных GPU с устаревшими архитектурами или CPU.
Идеализированных тестов, а не "среднепользовательских" сценариев.
Для игр или стандартных вычислений прирост между поколениями GPU обычно составляет 1.5–2 раза, что соответствует закону Мура.
Правильно понимаю, что ИИ ответил невпопад? Какие-то общие слова.
Конечно! Вот пример функции на Clarion, которая преобразует числовую сумму в текстовое представление на английском языке. Этот код аналогичен вашему исходному, но адаптирован для английского языка.а можешь написать функцию, чтобы выдавала сумму прописью по-английски на Clarion? какие идеи? Хотелось бы код целиком
Код: Выделить всё
SummCharEnglish FUNCTION (REAL RMoney) ! Declare Procedure
Buff STRING(255)
grp1 GROUP, PRE(), DIM(255), OVER(Buff)
D STRING(1)
END
KooP BYTE
Buf STRING(16)
grp2 GROUP, PRE(), DIM(16), OVER(Buf)
B STRING(1)
END
Names STRING(20), DIM(3)
Mon SHORT, DIM(6)
I BYTE
J BYTE
SKoop STRING(8)
!--------------------------------------------------------------
CODE ! Begin processed code
Buff=''
IF Rmoney <= 0
Buff = 'zero dollars and 00 cents'
DO ProcedureReturn
.
Buf=Format(RMoney,@N_016.2)
DO ParseAmount
DO FormatDollars
DO FormatCents
Buff=Clip(Buff) &' and '& Format(KooP,@n02) & SKooP
IF d[1]=' '
LOOP i=2 to 255
d[i-1]=d[i]
.
.
IF Sub(Buff,1,3) = 'dol' THEN Buff = 'zero ' & Buff .
DO ProcedureReturn
!--------------------------------------------------------------
ParseAmount Routine ! Parse the amount into categories
!--------------------------------------------------------------
LOOP I=1 TO 6
Mon[I]=0
.
LOOP I=1 TO 16
IF B[I]=' ' THEN B[I]='0' ELSE BREAK .
.
I=Len(Clip(Buf))-3
KooP=Sub(Buf,Len(Clip(Buf))-1,2) ! cents
Names[1]='billion'
Mon[1]=Sub(Buf,2,3) ! billions
Names[2]='million'
Mon[2]=Sub(Buf,5,3) ! millions
Names[3]='thousand'
Mon[3]=Sub(Buf,8,3) ! thousands
Mon[4]=Sub(Buf,11,3) ! units
!-----------------------------------------------------------------------
FormatDollars Routine ! Format dollars part
!-----------------------------------------------------------------------
LOOP i=1 TO 4
Buf=Format(Mon[i],@n_03)
LOOP j=1 TO 3
IF B[j]=' '
B[j]='0'
ELSE
BREAK
.
.
IF Mon[i]=0 THEN CYCLE .
LOOP j=1 TO 3
CASE j
OF 1; DO FormatHundreds
OF 2; DO FormatTens
OF 3; DO FormatUnits
END
.
.
!--------------------------------------------------------------
FormatHundreds ROUTINE ! Format hundreds
!--------------------------------------------------------------
CASE b[j]
OF 1; Buff=Clip(Buff)&' one hundred'
OF 2; Buff=Clip(Buff)&' two hundred'
OF 3; Buff=Clip(Buff)&' three hundred'
OF 4; Buff=Clip(Buff)&' four hundred'
OF 5; Buff=Clip(Buff)&' five hundred'
OF 6; Buff=Clip(Buff)&' six hundred'
OF 7; Buff=Clip(Buff)&' seven hundred'
OF 8; Buff=Clip(Buff)&' eight hundred'
OF 9; Buff=Clip(Buff)&' nine hundred'
END
!--------------------------------------------------------------
FormatTens ROUTINE ! Format tens
!--------------------------------------------------------------
CASE b[j]
OF 1; j+=1
CASE b[j]
OF 1; Buff=Clip(Buff)&' eleven'
OF 2; Buff=Clip(Buff)&' twelve'
OF 3; Buff=Clip(Buff)&' thirteen'
OF 4; Buff=Clip(Buff)&' fourteen'
OF 5; Buff=Clip(Buff)&' fifteen'
OF 6; Buff=Clip(Buff)&' sixteen'
OF 7; Buff=Clip(Buff)&' seventeen'
OF 8; Buff=Clip(Buff)&' eighteen'
OF 9; Buff=Clip(Buff)&' nineteen'
OF 0; Buff=Clip(Buff)&' ten'
END
CASE i
OF 1; Buff=Clip(Buff)&' billion'
OF 2; Buff=Clip(Buff)&' million'
OF 3; Buff=Clip(Buff)&' thousand'
END
OF 2; Buff=Clip(Buff)&' twenty'
OF 3; Buff=Clip(Buff)&' thirty'
OF 4; Buff=Clip(Buff)&' forty'
OF 5; Buff=Clip(Buff)&' fifty'
OF 6; Buff=Clip(Buff)&' sixty'
OF 7; Buff=Clip(Buff)&' seventy'
OF 8; Buff=Clip(Buff)&' eighty'
OF 9; Buff=Clip(Buff)&' ninety'
END
!--------------------------------------------------------------
FormatUnits Routine ! Format units
!--------------------------------------------------------------
CASE i
OF 1
CASE b[j]
OF 1; Buff=Clip(Buff)&' one billion'
OF 2; Buff=Clip(Buff)&' two billion'
OF 3; Buff=Clip(Buff)&' three billion'
OF 4; Buff=Clip(Buff)&' four billion'
OF 5; Buff=Clip(Buff)&' five billion'
OF 6; Buff=Clip(Buff)&' six billion'
OF 7; Buff=Clip(Buff)&' seven billion'
OF 8; Buff=Clip(Buff)&' eight billion'
OF 9; Buff=Clip(Buff)&' nine billion'
OF 0; Buff=Clip(Buff)&' billion'
END
OF 2
CASE b[j]
OF 1; Buff=Clip(Buff)&' one million'
OF 2; Buff=Clip(Buff)&' two million'
OF 3; Buff=Clip(Buff)&' three million'
OF 4; Buff=Clip(Buff)&' four million'
OF 5; Buff=Clip(Buff)&' five million'
OF 6; Buff=Clip(Buff)&' six million'
OF 7; Buff=Clip(Buff)&' seven million'
OF 8; Buff=Clip(Buff)&' eight million'
OF 9; Buff=Clip(Buff)&' nine million'
OF 0; Buff=Clip(Buff)&' million'
END
OF 3
CASE b[j]
OF 1; Buff=Clip(Buff)&' one thousand'
OF 2; Buff=Clip(Buff)&' two thousand'
OF 3; Buff=Clip(Buff)&' three thousand'
OF 4; Buff=Clip(Buff)&' four thousand'
OF 5; Buff=Clip(Buff)&' five thousand'
OF 6; Buff=Clip(Buff)&' six thousand'
OF 7; Buff=Clip(Buff)&' seven thousand'
OF 8; Buff=Clip(Buff)&' eight thousand'
OF 9; Buff=Clip(Buff)&' nine thousand'
OF 0; Buff=Clip(Buff)&' thousand'
END
OF 4
CASE b[j]
OF 1; Buff=Clip(Buff)&' one'
OF 2; Buff=Clip(Buff)&' two'
OF 3; Buff=Clip(Buff)&' three'
OF 4; Buff=Clip(Buff)&' four'
OF 5; Buff=Clip(Buff)&' five'
OF 6; Buff=Clip(Buff)&' six'
OF 7; Buff=Clip(Buff)&' seven'
OF 8; Buff=Clip(Buff)&' eight'
OF 9; Buff=Clip(Buff)&' nine'
END
END
!--------------------------------------------------------------
FormatCents ROUTINE ! Format cents
!--------------------------------------------------------------
IF SUB(CLIP(KooP),-2,1) = 1
SKooP = ' cents'
EXIT
.
CASE SUB(CLIP(KooP),-1,1)
OF 1
SKooP = ' cent'
ELSE
SKooP = ' cents'
END
!--------------------------------------------------------------
ProcedureReturn ROUTINE
d[1]=Upper(d[1])
RETURN(Buff)
Этот код можно использовать для преобразования числовых сумм в текстовое представление на английском языке.one thousand two hundred thirty-four dollars and 56 cents
(С)а что так можно было?
Ответ:Задача: можешь написать функцию на Clarion в зависимости от параметра возвращающую разделитель целой и дробной части числа, или разделитель целой и дробной части денежной единицы, или разделитель в краткой дате Windows. Можно чтением реестра или с помощью API
Код: Выделить всё
GetSeparator PROCEDURE(LONG separatorType), STRING
MAP
END
GetSeparator PROCEDURE(LONG separatorType)
LOC:DecimalSeparator STRING(1)
LOC:MonetarySeparator STRING(1)
LOC:DateSeparator STRING(1)
LOC:Buffer STRING(255)
CODE
CASE separatorType
OF 1 ! Разделитель целой и дробной части числа
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, LOC:DecimalSeparator, 1)
RETURN LOC:DecimalSeparator
OF 2 ! Разделитель целой и дробной части денежной единицы
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONTHOUSANDSEP, LOC:MonetarySeparator, 1)
RETURN LOC:MonetarySeparator
OF 3 ! Разделитель в краткой дате Windows
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDATE, LOC:DateSeparator, 1)
RETURN LOC:DateSeparator
ELSE
RETURN '' ! Возвращаем пустую строку, если тип разделителя не распознан
END
Код: Выделить всё
Separator STRING(1)
Separator = GetSeparator(1) ! Получить разделитель дробной части числа
MESSAGE('Разделитель дробной части числа: ' & Separator)
я через браузер. У меня знакомый ставил локально, вполне говорит быстро работает, но у него видяха нВидео 32 гб. Говорит общался через повершелл. Но есть оболочки. Моя видяха 16, по нижней планке проходит. Но обучать дальше прийдется самому.gopstop2007 писал(а): 02 Февраль 2025, 15:12 Как вы работаете с ними, через виртуалку, докер или другие варианты?
ответ:написать для языка программирования Clarion класс, чтобы сворачивал программу в трей (панель задач), с методами типа:
cTray CLASS, TYPE, MODULE('myTray.clw'), LINK('myTray.clw')
TRAYDATA LIKE(NOTIFYICONDATA), PRIVATE ! данные о трэе
IconID long(100) ! уникальный ID иконы
TipText CSTRING(64) ! текст для "типчика"
EscHide BYTE ! флаг - по ESC прятаться
MinHide BYTE ! флаг - прятаться при минимизации (ICONIZED)
UsePopup BYTE ! использовать popup по правой кнопке
TrayPopup CSTRING(64), PRIVATE
Init PROCEDURE ! инит надо делать после открытия окна
Kill PROCEDURE
AddIcon PROCEDURE(STRING IconName) ! добавить икону на трэй
ChangeIcon PROCEDURE(STRING IconName) ! изменить икону на трэе
RemoveIcon PROCEDURE ! удалить икону с трэя
ChangeTip PROCEDURE(STRING TipText) ! изменить текст "типчика"
ShowWnd PROCEDURE ! показать окно
HideWnd PROCEDURE ! спрятать окно
TakeEvent PROCEDURE, BYTE ! обработка событий для трэя
END
Код: Выделить всё
<!-- Clarion does not support HTML directly, but here is the equivalent Clarion code for your request -->
CODE
MAP('myTray.clw')
cTray CLASS, TYPE, MODULE('myTray.clw'), LINK('myTray.clw')
TRAYDATA LIKE(NOTIFYICONDATA), PRIVATE ! данные о трэе
IconID LONG(100) ! уникальный ID иконы
TipText CSTRING(64) ! текст для "типчика"
EscHide BYTE ! флаг - по ESC прятаться
MinHide BYTE ! флаг - прятаться при минимизации (ICONIZED)
UsePopup BYTE ! использовать popup по правой кнопке
TrayPopup CSTRING(64), PRIVATE ! текст для контекстного меню
Init PROCEDURE ! инициализация после открытия окна
CLEAR(TRAYDATA)
TRAYDATA.hWnd = THIS.Window.Handle ! Установка HWND окна
TRAYDATA.uID = IconID ! Уникальный ID иконки
TRAYDATA.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP
TRAYDATA.uCallbackMessage = WM_USER + 100 ! Сообщение обратного вызова
STRING(TipText, SIZE(TipText)) = 'Tooltip' ! Текст подсказки
STRING(TRAYDATA.szTip, SIZE(TRAYDATA.szTip)) = TipText
Shell_NotifyIcon(NIM_ADD, ADDRESS(TRAYDATA)) ! Добавление иконки в трей
Kill PROCEDURE
Shell_NotifyIcon(NIM_DELETE, ADDRESS(TRAYDATA)) ! Удаление иконки из трея
AddIcon PROCEDURE(STRING IconName)
LOCAL hIcon : LONG
hIcon = LoadImage(0, IconName, IMAGE_ICON, 0, 0, LR_LOADFROMFILE)
IF hIcon
TRAYDATA.hIcon = hIcon
Shell_NotifyIcon(NIM_MODIFY, ADDRESS(TRAYDATA)) ! Обновление иконки
END
ChangeIcon PROCEDURE(STRING IconName)
AddIcon(IconName)
RemoveIcon PROCEDURE
TRAYDATA.hIcon = 0
Shell_NotifyIcon(NIM_MODIFY, ADDRESS(TRAYDATA))
ChangeTip PROCEDURE(STRING NewTipText)
STRING(TRAYDATA.szTip, SIZE(TRAYDATA.szTip)) = NewTipText
Shell_NotifyIcon(NIM_MODIFY, ADDRESS(TRAYDATA))
ShowWnd PROCEDURE
ShowWindow(THIS.Window.Handle, SW_SHOW)
HideWnd PROCEDURE
ShowWindow(THIS.Window.Handle, SW_HIDE)
TakeEvent PROCEDURE, BYTE
LOCAL Message : LONG
Message = GETMESSAGE()
SELECT Message
CASE WM_LBUTTONDBLCLK
ShowWnd()
CASE WM_RBUTTONDOWN
IF UsePopup THEN
TrackPopupMenu(TrayPopup, TPM_LEFTALIGN, MOUSE_X(), MOUSE_Y(), 0, THIS.Window.Handle, 0)
END
END
END
END MAP
Код: Выделить всё
// keygen.cpp : Defines the entry point for the application.
#include "stdafx.h"
#include "resource.h"
#include "include\aspr_keygen.h"
#define MAX_LOADSTRING 100
#define RegistrationKeyGenerateName "RegistrationKeyGenerate"
typedef DWORD (__stdcall *ASPRegistrationKeyGenerate)(IN OUT PARAMS *Params);
HINSTANCE KeyGenDll;
ASPRegistrationKeyGenerate RegKeyGenerate;
//---------------------------------------------------------------------
// Source Code Template, KeyGen v0.01
BOOL GenerateKey( LPSTR* KeyStr, LPSTR NameStr, DWORD& Res )
{
PARAMS P;
memset(&P, 0, sizeof(PARAMS));
// Registration name
P.RegName = NameStr;
// Mode number (1..15)
P.ModeID = 2;
// Expiration date
P.ExpirationDate.Day = 0;
P.ExpirationDate.Month = 0;
P.ExpirationDate.Year = 0;
// Constant for encryption
P.EncryptionConst = 699935518;
// HardwareID
P.HardwareID = "";
// Signature size in bits
P.SignatureBits = 96;
// Constants from project file
P.C1 =
"AC08B45461D28EB";
P.C3 =
"A93A5FB8C78D04F1";
P.C6 =
"26D6BB434014649375231C68A655B81D314AEAF3CE32C6DC8BD"\
"CBCB9EEDC61EBA3C4A2119685E22205B782C88BFAF21FE98D4"\
"474FBDB1AFA539B05F09EF60DDF5BA8224161942B9582D37DD"\
"D624A97C373E5BB33BFC2335A674E4839D72253BA62B97F0B3"\
"6BCA5B4001353FED5D28FED31FA53C343F381BE121E106F669"\
"5B3CB";
P.C7 =
"1726DAE1BD153379F1FB0F4F2E00C06D39A733B7715D108EF0C"\
"518A11DF528394E37F744E1CEE1B4B411FEAFD7DDE0E281042"\
"A728F85FEDB91C8C2ECECF31873C77D68053D550EB8549FDE2"\
"C1885F40B68E1F0FF3383B747882AA517EB6F9061E23650222"\
"85F1B1BEA91F83E2C4CD66BF0C636FC79B81A738D65D6F5BF8"\
"0234D7";
memset(KeyStr, 0, 100 );
P.RegKey = (LPTSTR)KeyStr; // Buffer for registration key
P.RegKeySize = 100; // Size of a buffer for reg. key
// Generating...
Res = RegKeyGenerate(&P);
if(Res == kgERROR_SUCCESS)
{
memcpy(KeyStr, P.RegKey, P.RealKeySize);
return TRUE;
}
else return FALSE;
}
//---------------------------------------------------------------------
void ProcessRegistration( HWND hwnd )
{
DWORD Res;
char* ResStr;
char KeyStr[256];
char NameStr[256];
int size;
size = GetDlgItemText(hwnd, IDC_REGNAME_EDIT, NameStr, 256);
if (size > 0) NameStr[size] = 0;
memset(&KeyStr, 0, sizeof(KeyStr));
if(GenerateKey( (LPSTR*)KeyStr, (LPSTR)NameStr, Res ) == FALSE)
{
switch (Res)
{
case kgERROR_KG_ERROR : ResStr = "Key generator error!"; break;
case kgERROR_MODE_UNKNOWN : ResStr = "Unknown mode number!"; break;
case kgERROR_REGNAME_ERROR : ResStr = "Incorrect registration name!"; break;
case kgERROR_SIGNATURE_ERROR : ResStr = "Unknown mode signature!"; break;
case kgERROR_BUFFER_TOO_SMALL : ResStr = "Result buffer too small!"; break;
case kgERROR_CONSTANTS_UNDEFINED : ResStr = "Incorrect constants!"; break;
case kgERROR_HARDWAREID_ERROR : ResStr = "Invalid HardwareID key!"; break;
}
MessageBox(hwnd, ResStr, "Error", MB_ICONINFORMATION);
}
else
{
SetDlgItemText(hwnd, IDC_REGKEY_EDIT, KeyStr);
}
}
//---------------------------------------------------------------------
BOOL APIENTRY DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
// Cmd
case WM_INITDIALOG:
SetDlgItemText(hwnd, IDC_REGNAME_EDIT, "Registered User");
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_GENERATE:
ProcessRegistration( hwnd );
break;
case IDC_EXIT:
EndDialog(hwnd, IDC_EXIT);
break;
case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
break;
}
break;
}
return FALSE;
}
//---------------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow){
// LoadLibrary "keygen.dll"
KeyGenDll = LoadLibrary("keygen.dll");
if(KeyGenDll == NULL)
{
MessageBox(0, "keygen.dll not found!", "Error", MB_ICONSTOP);
return 0;
}
// GetProcAddress "ASPRegistrationKeyGenerate"
RegKeyGenerate = (ASPRegistrationKeyGenerate)GetProcAddress(KeyGenDll, RegistrationKeyGenerateName);
if(RegKeyGenerate == NULL)
{
MessageBox(0, "`ASPRegistrationKeyGenerate` function not found!", "Error", MB_ICONSTOP);
FreeLibrary(KeyGenDll);
return 0;
}
// DialogBox "IDD_DIALOG"
DialogBox(NULL,(LPSTR)MAKEINTRESOURCE(IDD_DIALOG),NULL,(DLGPROC/*WNDPROC*/)DlgProc);
if(KeyGenDll != NULL) FreeLibrary(KeyGenDll);
return 0;
}
Код: Выделить всё
PROGRAM
MAP
END
END
;----------------------------------------------------------
; Структуры данных
;----------------------------------------------------------
PARAMS GROUP,TYPE
RegName LONG
ModeID LONG
ExpirationDate GROUP
Day WORD
Month WORD
Year WORD
END
EncryptionConst LONG
HardwareID LONG
SignatureBits LONG
C1 LONG
C3 LONG
C6 LONG
C7 LONG
RegKey LONG
RegKeySize LONG
RealKeySize LONG
END
DATE_STRUCT EQUATE(PARAMS.ExpirationDate)
;----------------------------------------------------------
; Импорт функций WinAPI
;----------------------------------------------------------
Kernel32 PROCEDURE(LPCSTR),LONG,NAME('LoadLibraryA'),RAW
GetProcAddress PROCEDURE(LONG,LPCSTR),LONG,RAW,PASCAL
FreeLibrary PROCEDURE(LONG),BOOL,RAW,PASCAL
MessageBox PROCEDURE(HWND,LPSTR,LPSTR,LONG),LONG,RAW,PASCAL
GetDlgItemText PROCEDURE(HWND,LONG,LPSTR,LONG),LONG,RAW,PASCAL
SetDlgItemText PROCEDURE(HWND,LONG,LPSTR),BOOL,RAW,PASCAL
DialogBoxParam PROCEDURE(HINSTANCE,LPSTR,HWND,LONG,LONG),LONG,RAW,PASCAL
;----------------------------------------------------------
KeyGenDll LONG
RegKeyGenerate LONG
kgERROR_SUCCESS EQUATE(0)
MAX_LOADSTRING EQUATE(100)
IDD_DIALOG EQUATE(100)
IDC_REGNAME_EDIT EQUATE(101)
IDC_REGKEY_EDIT EQUATE(102)
IDC_GENERATE EQUATE(103)
IDC_EXIT EQUATE(104)
;----------------------------------------------------------
; Прототипы процедур
;----------------------------------------------------------
GenerateKey PROCEDURE(*CSTRING,*CSTRING,*LONG),BOOL
ProcessRegistration PROCEDURE(HWND)
DlgProc PROCEDURE(HWND,ULONG,LONG,LONG),LONG
;----------------------------------------------------------
GenerateKey PROCEDURE(*CSTRING KeyStr, *CSTRING NameStr, *LONG Res)
P LIKE(PARAMS)
C1 CSTRING('AC08B45461D28EB')
C3 CSTRING('A93A5FB8C78D04F1')
C6 CSTRING('26D6BB434014649375231C68A655B81D314AEAF3CE32C6DC8BDCBCB9EEDC61EBA3C4A2119685E22205B782C88BFAF21FE98D4474FBDB1AFA539B05F09EF60DDF5BA8224161942B9582D37DDD624A97C373E5BB33BFC2335A674E4839D72253BA62B97F0B36BCA5B4001353FED5D28FED31FA53C343F381BE121E106F6695B3CB')
C7 CSTRING('1726DAE1BD153379F1FB0F4F2E00C06D39A733B7715D108EF0C518A11DF528394E37F744E1CEE1B4B411FEAFD7DDE0E281042A728F85FEDB91C8C2ECECF31873C77D68053D550EB8549FDE2C1885F40B68E1F0FF3383B747882AA517EB6F9061E2365022285F1B1BEA91F83E2C4CD66BF0C636FC79B81A738D65D6F5BF80234D7')
END
CODE
CLEAR(P)
P.RegName = ADDRESS(NameStr)
P.ModeID = 2
P.EncryptionConst = 699935518
P.SignatureBits = 96
P.C1 = ADDRESS(C1)
P.C3 = ADDRESS(C3)
P.C6 = ADDRESS(C6)
P.C7 = ADDRESS(C7)
P.RegKey = ADDRESS(KeyStr)
P.RegKeySize = 100
Res = CALL(RegKeyGenerate, ADDRESS(P))
IF Res = kgERROR_SUCCESS THEN RETURN TRUE
RETURN FALSE
;----------------------------------------------------------
ProcessRegistration PROCEDURE(HWND hwnd)
Res LONG
KeyStr CSTRING(256)
NameStr CSTRING(256)
CODE
GetDlgItemText(hwnd, IDC_REGNAME_EDIT, NameStr, 256)
KeyStr = ''
IF NOT GenerateKey(KeyStr, NameStr, Res) THEN
CASE Res
OF kgERROR_KG_ERROR
MessageBox(hwnd, 'Key generator error!', 'Error', 40h)
OF kgERROR_MODE_UNKNOWN
MessageBox(hwnd, 'Unknown mode number!', 'Error', 40h)
OF kgERROR_REGNAME_ERROR
MessageBox(hwnd, 'Incorrect registration name!', 'Error', 40h)
OF kgERROR_SIGNATURE_ERROR
MessageBox(hwnd, 'Unknown mode signature!', 'Error', 40h)
OF kgERROR_BUFFER_TOO_SMALL
MessageBox(hwnd, 'Result buffer too small!', 'Error', 40h)
OF kgERROR_CONSTANTS_UNDEFINED
MessageBox(hwnd, 'Incorrect constants!', 'Error', 40h)
OF kgERROR_HARDWAREID_ERROR
MessageBox(hwnd, 'Invalid HardwareID key!', 'Error', 40h)
END
ELSE
SetDlgItemText(hwnd, IDC_REGKEY_EDIT, KeyStr)
END
;----------------------------------------------------------
DlgProc PROCEDURE(HWND hDlg, ULONG uMsg, LONG wParam, LONG lParam)
CODE
CASE uMsg
OF WM_INITDIALOG
SetDlgItemText(hDlg, IDC_REGNAME_EDIT, 'Registered User')
RETURN 1
OF WM_COMMAND
CASE LOWORD(wParam)
OF IDC_GENERATE
ProcessRegistration(hDlg)
OF IDC_EXIT
END(DialogResult, 1)
END
RETURN 1
END
RETURN 0
;----------------------------------------------------------
MAP
WINDOW('Keygen'),AT(,,200,150),SYSTEM,GRAY,DOUBLE
STRING('Name:'),AT(10,10)
ENTRY(IDC_REGNAME_EDIT),AT(50,10,100),USE(?NameEdit)
BUTTON('Generate',IDC_GENERATE),AT(10,40)
STRING('Key:'),AT(10,70)
ENTRY(IDC_REGKEY_EDIT),AT(50,70,100),USE(?KeyEdit)
BUTTON('Exit',IDC_EXIT),AT(10,100)
END
;----------------------------------------------------------
Main PROCEDURE
CODE
KeyGenDll = Kernel32('keygen.dll')
IF KeyGenDll = 0 THEN
MessageBox(0, 'keygen.dll not found!', 'Error', 10h)
RETURN
END
RegKeyGenerate = GetProcAddress(KeyGenDll, 'ASPRegistrationKeyGenerate')
IF RegKeyGenerate = 0 THEN
MessageBox(0, 'Function not found!', 'Error', 10h)
FreeLibrary(KeyGenDll)
RETURN
END
DIALOG(DlgProc, IDD_DIALOG)
FreeLibrary(KeyGenDll)