У меня ошибка. Кто поможет
Код:
int __fastcall TZash::LoadWordListFile(const String& sFileName)
{
int nNumOfWords = WORDLIST_DEFAULT_SIZE;
TStringList* pWordList = NULL;
if (!sFileName.IsEmpty()) {
FILE* pFile = fopen(sFileName.c_str(), "ru");
if (pFile == NULL)
return -1;
pWordList = new TStringList();
//игнорировать дубликаты
pWordList->Sorted = true;
pWordList->Duplicates = dupIgnore;
Refresh();
Screen->Cursor = crHourGlass;
#if 0
const int BUFSIZE = 64;
char szBuf[BUFSIZE];
while (fgets(szBuf, BUFSIZE, pFile) != NULL &&
pWordList->Count < WORDLIST_MAX_SIZE)
{
int nWordLen = strlen(szBuf);
if (szBuf[nWordLen-1] == '\n')
szBuf[--nWordLen] = '\0';
if (nWordLen > 0 && nWordLen <= m_nMaxWordLen)
pWordList->Add(szBuf);
}
#else
const int BUFSIZE = 16384;
char szBuf[BUFSIZE];
char szWord[WORDLIST_MAX_WORDLEN + 1];
int nCharsRead;
int nWordLen = 0;
bool blBreak = false;
while (!blBreak)
{
nCharsRead = fread(szBuf, 1, BUFSIZE, pFile);
if (nCharsRead == 0) {
blBreak = true;
szBuf[nCharsRead++] = '\n';
}
for (int nI = 0; nI < nCharsRead; nI++) {
char c = szBuf[nI];
switch (c) {
case '\n':
case '\t':
case ' ':
if (nWordLen > 0 && nWordLen <= m_nMaxWordLen) {
szWord[nWordLen] = '\0';
pWordList->Add(szWord);
if (pWordList->Count == WORDLIST_MAX_SIZE) {
blBreak = true;
nI = nCharsRead;
}
}
nWordLen = 0;
break;
default:
if (nWordLen < m_nMaxWordLen)
szWord[nWordLen] = c;
nWordLen++;
continue;
}
}
}
#endif
fclose(pFile);
Screen->Cursor = crDefault;
nNumOfWords = pWordList->Count;
if (nNumOfWords < 2) {
delete pWordList;
return 0;
}
//давайте обрабатывать ресурсы памяти экономически
pWordList->Capacity = pWordList->Count;
}
if (m_pWordList != NULL)
delete m_pWordList;
m_pWordList = pWordList;
m_dWordListEntropy = Log2(nNumOfWords);
/*WordListInfoLbl->Caption = TRLFormat("%d words / %.1f bits per word",
ARRAYOFCONST((nNumOfWords, roundEntropy(m_dWordListEntropy)))); */
return nNumOfWords;
}
{
int nNumOfWords = WORDLIST_DEFAULT_SIZE;
TStringList* pWordList = NULL;
if (!sFileName.IsEmpty()) {
FILE* pFile = fopen(sFileName.c_str(), "ru");
if (pFile == NULL)
return -1;
pWordList = new TStringList();
//игнорировать дубликаты
pWordList->Sorted = true;
pWordList->Duplicates = dupIgnore;
Refresh();
Screen->Cursor = crHourGlass;
#if 0
const int BUFSIZE = 64;
char szBuf[BUFSIZE];
while (fgets(szBuf, BUFSIZE, pFile) != NULL &&
pWordList->Count < WORDLIST_MAX_SIZE)
{
int nWordLen = strlen(szBuf);
if (szBuf[nWordLen-1] == '\n')
szBuf[--nWordLen] = '\0';
if (nWordLen > 0 && nWordLen <= m_nMaxWordLen)
pWordList->Add(szBuf);
}
#else
const int BUFSIZE = 16384;
char szBuf[BUFSIZE];
char szWord[WORDLIST_MAX_WORDLEN + 1];
int nCharsRead;
int nWordLen = 0;
bool blBreak = false;
while (!blBreak)
{
nCharsRead = fread(szBuf, 1, BUFSIZE, pFile);
if (nCharsRead == 0) {
blBreak = true;
szBuf[nCharsRead++] = '\n';
}
for (int nI = 0; nI < nCharsRead; nI++) {
char c = szBuf[nI];
switch (c) {
case '\n':
case '\t':
case ' ':
if (nWordLen > 0 && nWordLen <= m_nMaxWordLen) {
szWord[nWordLen] = '\0';
pWordList->Add(szWord);
if (pWordList->Count == WORDLIST_MAX_SIZE) {
blBreak = true;
nI = nCharsRead;
}
}
nWordLen = 0;
break;
default:
if (nWordLen < m_nMaxWordLen)
szWord[nWordLen] = c;
nWordLen++;
continue;
}
}
}
#endif
fclose(pFile);
Screen->Cursor = crDefault;
nNumOfWords = pWordList->Count;
if (nNumOfWords < 2) {
delete pWordList;
return 0;
}
//давайте обрабатывать ресурсы памяти экономически
pWordList->Capacity = pWordList->Count;
}
if (m_pWordList != NULL)
delete m_pWordList;
m_pWordList = pWordList;
m_dWordListEntropy = Log2(nNumOfWords);
/*WordListInfoLbl->Caption = TRLFormat("%d words / %.1f bits per word",
ARRAYOFCONST((nNumOfWords, roundEntropy(m_dWordListEntropy)))); */
return nNumOfWords;
}
FILE* pFile = fopen(sFileName.c_str(), "ru");
Код ошибки
[BCC32 Error] ZachYlKn1.cpp(756): E2342 Type mismatch in parameter '__path' (wanted 'const char *', got 'wchar_t *')
Full parser context
ZachYlKn1.cpp(751): parsing: int _fastcall TZash::LoadWordListFile(const UnicodeString &)
Type mismatch in parameter - несоответствие типов
где?
в __path - в пути к файлу
почему?
wanted 'const char *', - требовался указатель на константный символ
got 'wchar_t *' - а ему подсунули указатель на широкий символ юникода.
Вывод: преобразовать результат sFileName.c_str() в const char *.
Ищи преобразование wchar_t * в const char *.
Это что за режим fopen-а "ru" ? Читаем о ф-ции
Код:
Код:
void __fastcall TZash::Button8Click(TObject *Sender)
{
int nNumOfPassw = 1;
if (Sender == Button8){
nNumOfPassw = passNUmEdit2->Text.ToIntDef(0);
if (nNumOfPassw < 1 || nNumOfPassw > PASSW_MAX_NUM) {
MsgBox(TRLFormat("Неверное количество паролей.\nMinimum - 1, а максимальный "
"is %d.", ARRAYOFCONST((PASSW_MAX_NUM))), MB_ICONERROR);
passNUmEdit2->SetFocus();
return;
}
}
int nCharsLen = 0, nNumOfWords = 0;
double dPasswSec = 0;
if (CheckBox1->Checked) {
nCharsLen = WordsNumBoxEdit4->Text.ToIntDef(0);
if (nCharsLen < 1 || nCharsLen > PASSW_MAX_CHARS) {
MsgBox(TRLFormat("Неверное количество символов.\nMinimum - 1, а максимальный "
"is %d.", ARRAYOFCONST((PASSW_MAX_CHARS))), MB_ICONERROR);
WordsNumBoxEdit4->SetFocus();
return;
}
dPasswSec = nCharsLen * m_dCharSetEntropy;
}
if (CheckBox2->Checked) {
nNumOfWords = WordsNumBoxEdit5->Text.ToIntDef(0);
if (nNumOfWords < 1 || nNumOfWords > PASSW_MAX_WORDS) {
MsgBox(TRLFormat("Неверное количество слов.\nMinimum - 1, а максимальный "
"is %d.", ARRAYOFCONST((PASSW_MAX_WORDS))), MB_ICONERROR);
WordsNumBoxEdit5->SetFocus();
return;
}
dPasswSec += nNumOfWords * m_dWordListEntropy;
}
int nPasswSec = min(Floor(dPasswSec), ENTROPY_MAX);
const String sPasswListInfoOrig = "%d пароли генерируются.\r\пмаксимальная безопасности "
"каждый пароль: %d бит.\r\пмаксимальная безопасности "
"всего списка: %d бит.";
static String sPassListMemo1Info;
TStringList* pPassList = NULL;
bool blCallback = false;
try {
bool blNoDuplicates = m_passOptions[PASSOPTION_NODUPLICATES];
int nCallbackFreq;
if (nNumOfPassw > 1) {
if (sPassListMemo1Info.IsEmpty())
sPassListMemo1Info = TRL(sPassListMemo1Info);
pPassList = new TStringList;
pPassList->Capacity = nNumOfPassw;
Form4->Close();
if (blNoDuplicates || nNumOfPassw > 5000) {
blCallback = true;
CallbackForm4->Init(TRL("Создание пароля из списка ..."), TRL("%d of %d "
"пароли генерируются"), nNumOfPassw);
nCallbackFreq = (blNoDuplicates) ? 100 : 1000;
}
else
Refresh();
Screen->Cursor = (blCallback) ? crAppStart : crHourGlass;
}
// добавить энтропии системы перед инициализацией PRNG -...
m_pEntropyMng->AddSystemEntropy();
int nI, nPasswFlags = 0, nPassphrFlags = 0;
SecureWString sChars, sWords;
bool blFirstCharNotLC = m_passOptions[PASSOPTION_FIRSTCHARNOTLC];
if (nCharsLen != 0) {
if (blFirstCharNotLC && m_blCharSetNonLC)
nPasswFlags |= GENPASSW_FIRSTCHARNOTLC;
if (m_passOptions[PASSOPTION_EXCLUDEREPCHARS])
nPasswFlags |= GENPASSW_EXCLUDEREPCHARS;
for (nI = 0; nI < GENPASSW_NUMOPTCHARSETS; nI++) {
if (m_passOptions[PASSOPTION_INCLUDEUCL+nI])
nPasswFlags |= GENPASSW_INCLUDEUCL << nI;
}
sChars.New(nCharsLen + 1);
}
if (nNumOfWords != 0) {
if (CheckBox3->Checked)
nPassphrFlags |= GENPASSPHR_COMBINEWCH;
if (m_passOptions[PASSOPTION_SEPWORDS])
nPassphrFlags |= GENPASSPHR_DONTSEPWORDS;
if (m_passOptions[PASSOPTION_SEPWORDSCHARS])
nPassphrFlags |= GENPASSPHR_DONTSEPWCH;
if (nPassphrFlags & GENPASSPHR_COMBINEWCH)
nPasswFlags &= ~GENPASSW_FIRSTCHARNOTLC;
sWords.New(nCharsLen + nNumOfWords * (WORDLIST_MAX_WORDLEN + 2) + 1);
}
int nPasswLen, nPasswCnt = 0;
int nPasswBytes = sPassListMemo1Info.Length() + 9;
int nConsecDupl = 0, nMaxDupl = INT_MAX;
try {
for (nI = 0; nPasswCnt < nNumOfPassw; nI++) {
if (nConsecDupl > nMaxDupl) {
MsgBox(TRLFormat("Система защиты останавливается здесь для того, чтобы"
"избежать бесконечного цикла.\n"-
"Наверное, это не возможно, чтобы создать список из"
"%d\nunique записи "
"с нынешним пароль.\n\но, %d уникальный "
"паролей может быть\ngenerated успешно.",
ARRAYOFCONST((nNumOfPassw, nPasswCnt))), MB_ICONWARNING);
break;
}
if (blCallback && nI == nCallbackFreq) {
CallbackForm4->Callback(nPasswCnt);
nI = 0;
}
if (nCharsLen != 0)
nPasswLen = GenPassword(sChars, nCharsLen, m_sCharSet, m_charSetPredefined,
nPasswFlags, g_pRandomPool);
if (nNumOfWords != 0)
nPasswLen = GenPassphrase(sWords, nNumOfWords, m_pWordList, sChars,
nPassphrFlags, g_pRandomPool);
wchar_t* pszPass = (nNumOfWords != 0) ? sWords : sChars;
if (blFirstCharNotLC && IsLower(pszPass[0]))
pszPass[0] = ToUpper(pszPass[0]);
if (nNumOfPassw == 1) {
ClearTextBuf(PassEdit3);
PassEdit3->SetTextBuf(pszPass);
PassInfoLbl->Caption = TRLFormat("Длина: %d символов / "
"Безопасность: %d бит", ARRAYOFCONST((nPasswLen, nPasswSec)));
}
nPasswBytes += nPasswLen + 2; // also count line breaks ("\r\n")!
if (nPasswBytes > m_nMaxPasswBytes) {
passNUmEdit2->Text = nPasswCnt;
MsgBox(TRLFormat("Достигнуто максимальное число байтов, Допускается\n"
"in the password list.\n\nNumber of passwords has been "
"снижена до %d.", ARRAYOFCONST((nPasswCnt))), MB_ICONWARNING);
break;
}
pPassList->Add(pszPassw);
nConsecDupl = 0;
}
nPasswCnt++;
}
}
catch (ECallback& e) {
MsgBox(TRLFormat("%s.\n%d пароли генерируются.", ARRAYOFCONST((e.Message,
nPasswCnt))), MB_ICONWARNING);
}
g_pRandPool->Flush();
m_pEntropyMng->ConsumeEntropyBits(nPasswSec * nPasswCnt);
UpdateEntropyProgress();
if (nNumOfPassw == 1)
PassEdit3->SetFocus();
else {
if (blCallback) {
CallbackForm4->ProgressBar1->Position = nPasswCnt;
CallbackForm4->ProgressLabel8->Caption = TRL("Копирование списка паролей ...");
CallbackForm4->Refresh();
}
String sHeader;
/*try {
sHeader = Format(sPasswListInfo, ARRAYOFCONST((nPasswCnt,
nPasswSec, min(nPasswSec * nPasswCnt, ENTROPY_MAX))));
}
catch (EConvertError& e) {
pLangSupp->LastTranslError(e.Message);
sHeader = Format(sPasswListInfoOrig, ARRAYOFCONST((nPasswCnt,
nPasswSec, min(nPasswSec * nPasswCnt, ENTROPY_MAX))));
sPasswListInfo = sPasswListInfoOrig;
} */
Form4->PassListMemo1->Text = sHeader + "\r\n\r\n" + pPassListMemo1->Text;
delete pPassListMemo1;
pPassListMemo1 = NULL;
if (blCallback)
CallbackForm4->Terminate();
blCallback = false;
Screen->Cursor = crDefault;
Form4->Execute();
}
}
catch (Exception& e) {
MsgBox(TRLFormat("Произошла ошибка при генерации пароля:\n%s.",
ARRAYOFCONST((e.Message))), MB_ICONERROR);
g_pRandPool->Flush();
if (pPasswList != NULL)
delete pPasswList;
if (blCallback)
CallbackForm4->Terminate();
Screen->Cursor = crDefault;
}
void __fastcall TZash::Button8Click(TObject *Sender)
{
int nNumOfPassw = 1;
if (Sender == Button8){
nNumOfPassw = passNUmEdit2->Text.ToIntDef(0);
if (nNumOfPassw < 1 || nNumOfPassw > PASSW_MAX_NUM) {
MsgBox(TRLFormat("Неверное количество паролей.\nMinimum - 1, а максимальный "
"is %d.", ARRAYOFCONST((PASSW_MAX_NUM))), MB_ICONERROR);
passNUmEdit2->SetFocus();
return;
}
}
int nCharsLen = 0, nNumOfWords = 0;
double dPasswSec = 0;
if (CheckBox1->Checked) {
nCharsLen = WordsNumBoxEdit4->Text.ToIntDef(0);
if (nCharsLen < 1 || nCharsLen > PASSW_MAX_CHARS) {
MsgBox(TRLFormat("Неверное количество символов.\nMinimum - 1, а максимальный "
"is %d.", ARRAYOFCONST((PASSW_MAX_CHARS))), MB_ICONERROR);
WordsNumBoxEdit4->SetFocus();
return;
}
dPasswSec = nCharsLen * m_dCharSetEntropy;
}
if (CheckBox2->Checked) {
nNumOfWords = WordsNumBoxEdit5->Text.ToIntDef(0);
if (nNumOfWords < 1 || nNumOfWords > PASSW_MAX_WORDS) {
MsgBox(TRLFormat("Неверное количество слов.\nMinimum - 1, а максимальный "
"is %d.", ARRAYOFCONST((PASSW_MAX_WORDS))), MB_ICONERROR);
WordsNumBoxEdit5->SetFocus();
return;
}
dPasswSec += nNumOfWords * m_dWordListEntropy;
}
int nPasswSec = min(Floor(dPasswSec), ENTROPY_MAX);
const String sPasswListInfoOrig = "%d пароли генерируются.\r\пмаксимальная безопасности "
"каждый пароль: %d бит.\r\пмаксимальная безопасности "
"всего списка: %d бит.";
static String sPassListMemo1Info;
TStringList* pPassList = NULL;
bool blCallback = false;
try {
bool blNoDuplicates = m_passOptions[PASSOPTION_NODUPLICATES];
int nCallbackFreq;
if (nNumOfPassw > 1) {
if (sPassListMemo1Info.IsEmpty())
sPassListMemo1Info = TRL(sPassListMemo1Info);
pPassList = new TStringList;
pPassList->Capacity = nNumOfPassw;
Form4->Close();
if (blNoDuplicates || nNumOfPassw > 5000) {
blCallback = true;
CallbackForm4->Init(TRL("Создание пароля из списка ..."), TRL("%d of %d "
"пароли генерируются"), nNumOfPassw);
nCallbackFreq = (blNoDuplicates) ? 100 : 1000;
}
else
Refresh();
Screen->Cursor = (blCallback) ? crAppStart : crHourGlass;
}
// добавить энтропии системы перед инициализацией PRNG -...
m_pEntropyMng->AddSystemEntropy();
int nI, nPasswFlags = 0, nPassphrFlags = 0;
SecureWString sChars, sWords;
bool blFirstCharNotLC = m_passOptions[PASSOPTION_FIRSTCHARNOTLC];
if (nCharsLen != 0) {
if (blFirstCharNotLC && m_blCharSetNonLC)
nPasswFlags |= GENPASSW_FIRSTCHARNOTLC;
if (m_passOptions[PASSOPTION_EXCLUDEREPCHARS])
nPasswFlags |= GENPASSW_EXCLUDEREPCHARS;
for (nI = 0; nI < GENPASSW_NUMOPTCHARSETS; nI++) {
if (m_passOptions[PASSOPTION_INCLUDEUCL+nI])
nPasswFlags |= GENPASSW_INCLUDEUCL << nI;
}
sChars.New(nCharsLen + 1);
}
if (nNumOfWords != 0) {
if (CheckBox3->Checked)
nPassphrFlags |= GENPASSPHR_COMBINEWCH;
if (m_passOptions[PASSOPTION_SEPWORDS])
nPassphrFlags |= GENPASSPHR_DONTSEPWORDS;
if (m_passOptions[PASSOPTION_SEPWORDSCHARS])
nPassphrFlags |= GENPASSPHR_DONTSEPWCH;
if (nPassphrFlags & GENPASSPHR_COMBINEWCH)
nPasswFlags &= ~GENPASSW_FIRSTCHARNOTLC;
sWords.New(nCharsLen + nNumOfWords * (WORDLIST_MAX_WORDLEN + 2) + 1);
}
int nPasswLen, nPasswCnt = 0;
int nPasswBytes = sPassListMemo1Info.Length() + 9;
int nConsecDupl = 0, nMaxDupl = INT_MAX;
try {
for (nI = 0; nPasswCnt < nNumOfPassw; nI++) {
if (nConsecDupl > nMaxDupl) {
MsgBox(TRLFormat("Система защиты останавливается здесь для того, чтобы"
"избежать бесконечного цикла.\n"-
"Наверное, это не возможно, чтобы создать список из"
"%d\nunique записи "
"с нынешним пароль.\n\но, %d уникальный "
"паролей может быть\ngenerated успешно.",
ARRAYOFCONST((nNumOfPassw, nPasswCnt))), MB_ICONWARNING);
break;
}
if (blCallback && nI == nCallbackFreq) {
CallbackForm4->Callback(nPasswCnt);
nI = 0;
}
if (nCharsLen != 0)
nPasswLen = GenPassword(sChars, nCharsLen, m_sCharSet, m_charSetPredefined,
nPasswFlags, g_pRandomPool);
if (nNumOfWords != 0)
nPasswLen = GenPassphrase(sWords, nNumOfWords, m_pWordList, sChars,
nPassphrFlags, g_pRandomPool);
wchar_t* pszPass = (nNumOfWords != 0) ? sWords : sChars;
if (blFirstCharNotLC && IsLower(pszPass[0]))
pszPass[0] = ToUpper(pszPass[0]);
if (nNumOfPassw == 1) {
ClearTextBuf(PassEdit3);
PassEdit3->SetTextBuf(pszPass);
PassInfoLbl->Caption = TRLFormat("Длина: %d символов / "
"Безопасность: %d бит", ARRAYOFCONST((nPasswLen, nPasswSec)));
}
nPasswBytes += nPasswLen + 2; // also count line breaks ("\r\n")!
if (nPasswBytes > m_nMaxPasswBytes) {
passNUmEdit2->Text = nPasswCnt;
MsgBox(TRLFormat("Достигнуто максимальное число байтов, Допускается\n"
"in the password list.\n\nNumber of passwords has been "
"снижена до %d.", ARRAYOFCONST((nPasswCnt))), MB_ICONWARNING);
break;
}
pPassList->Add(pszPassw);
nConsecDupl = 0;
}
nPasswCnt++;
}
}
catch (ECallback& e) {
MsgBox(TRLFormat("%s.\n%d пароли генерируются.", ARRAYOFCONST((e.Message,
nPasswCnt))), MB_ICONWARNING);
}
g_pRandPool->Flush();
m_pEntropyMng->ConsumeEntropyBits(nPasswSec * nPasswCnt);
UpdateEntropyProgress();
if (nNumOfPassw == 1)
PassEdit3->SetFocus();
else {
if (blCallback) {
CallbackForm4->ProgressBar1->Position = nPasswCnt;
CallbackForm4->ProgressLabel8->Caption = TRL("Копирование списка паролей ...");
CallbackForm4->Refresh();
}
String sHeader;
/*try {
sHeader = Format(sPasswListInfo, ARRAYOFCONST((nPasswCnt,
nPasswSec, min(nPasswSec * nPasswCnt, ENTROPY_MAX))));
}
catch (EConvertError& e) {
pLangSupp->LastTranslError(e.Message);
sHeader = Format(sPasswListInfoOrig, ARRAYOFCONST((nPasswCnt,
nPasswSec, min(nPasswSec * nPasswCnt, ENTROPY_MAX))));
sPasswListInfo = sPasswListInfoOrig;
} */
Form4->PassListMemo1->Text = sHeader + "\r\n\r\n" + pPassListMemo1->Text;
delete pPassListMemo1;
pPassListMemo1 = NULL;
if (blCallback)
CallbackForm4->Terminate();
blCallback = false;
Screen->Cursor = crDefault;
Form4->Execute();
}
}
catch (Exception& e) {
MsgBox(TRLFormat("Произошла ошибка при генерации пароля:\n%s.",
ARRAYOFCONST((e.Message))), MB_ICONERROR);
g_pRandPool->Flush();
if (pPasswList != NULL)
delete pPasswList;
if (blCallback)
CallbackForm4->Terminate();
Screen->Cursor = crDefault;
}
Ошибки. в строках
Код:
if (nCharsLen != 0)
nPasswLen = GenPassword(sChars, nCharsLen, m_sCharSet, m_charSetPredefined,
nPasswFlags, g_pRandomPool);
if (nNumOfWords != 0)
nPasswLen = GenPassphrase(sWords, nNumOfWords, m_pWordList, sChars,
nPassphrFlags, g_pRandomPool);
nPasswLen = GenPassword(sChars, nCharsLen, m_sCharSet, m_charSetPredefined,
nPasswFlags, g_pRandomPool);
if (nNumOfWords != 0)
nPasswLen = GenPassphrase(sWords, nNumOfWords, m_pWordList, sChars,
nPassphrFlags, g_pRandomPool);
[BCC32 Error] Zach.cpp(1068): E2357 Reference initialized with 'SecureWString', needs lvalue of type 'SecureString'
Full parser context
Zach.cpp(934): parsing: void _fastcall TZash::Button8Click(TObject *)
[BCC32 Error] Zach.cpp(1068): E2342 Type mismatch in parameter 'sDest' (wanted 'SecureString &', got 'SecureWString')
Full parser context
Zach.cpp(934): parsing: void _fastcall TZash::Button8Click(TObject *)
[BCC32 Error] Zach.cpp(1071): E2357 Reference initialized with 'SecureWString', needs lvalue of type 'SecureString'
Full parser context
Zach.cpp(934): parsing: void _fastcall TZash::Button8Click(TObject *)
[BCC32 Error] Zach.cpp(1071): E2342 Type mismatch in parameter 'sDest' (wanted 'SecureString &', got 'SecureWString')
Full parser context
Zach.cpp(934): parsing: void _fastcall TZash::Button8Click(TObject *)