我知道这是一个普遍的问题。但我迫切需要它,而且我根本不是繁荣昌盛的。
您需要启用此功能:
DLL_EXPORT int __stdcall EvalCRC(IStream* Data, IStream* Params, IStream* Output)
{
if (!Data) return ERROR_NULL_DATA;
// Data - это входной поток с прошивкой, контрольку в которой нужно пересчитать
// Params и Output пока не используются и зарезервированы на будущее
int Result = PLUGIN_SUCCESS; // По-умолчанию возвращаем результат успешного выполнения
ULARGE_INTEGER size_;
LARGE_INTEGER larg_;
//ENCODE_START
larg_.QuadPart = 0;
Data->Seek(larg_, STREAM_SEEK_END, &size_);
// Считаем КС прошивки
if (size_.QuadPart == VALIDFWSIZE1 || size_.QuadPart == VALIDFWSIZE2)
{
try
{
char arr[IDLEN+1];
ULONG ulong;
unsigned int caloffset;
switch(size_.QuadPart)
{
case VALIDFWSIZE1:
{
// Калибровки
larg_.QuadPart = CAL_POS1;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
arr[IDLEN]=0x00;
if (CheckNumber(arr)) caloffset=CAL_POS1;
else return ERROR_SIGNATURE;
}
break;
case VALIDFWSIZE2:
{
// Фулл
larg_.QuadPart = CAL_POS2;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
arr[IDLEN]=0x00;
if (CheckNumber(arr)) caloffset=CAL_POS2;
else
{
larg_.QuadPart = CAL_POS3;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
arr[IDLEN]=0x00;
if (CheckNumber(arr)) caloffset=CAL_POS3;
else return ERROR_SIGNATURE;
}
}
break;
}
larg_.QuadPart = caloffset;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
WORD wval=0;
for(unsigned int i=0;i<(cRangeSize/2)-1;i++)
{
WORD wword;
Data->Read(&wword, sizeof(WORD), &ulong);
wword = (wword >> 8) | (wword << 8); // Переворачиваем
if (i!=cCSPos/2) wval += wword; // Считаем все, кроме контрольных сумм
}
wval=0-wval;
larg_.QuadPart = caloffset+cCSPos;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
wval = (wval >> 8) | (wval << 8); // Переворачиваем
Data->Write(&wval, sizeof(WORD), &ulong);
}
catch(...)
{
Result = ERROR_EXCEPTION;
}
}
else Result = ERROR_INVALID_SIZE;
return Result;
}
为大家试过,然后数据类型不匹配,然后只是一些没有错误和结果的崩溃。如果不难,请告诉我连接字符串应该是什么样子?
假设您可以这样连接它(假设使用 COM 结构化存储的 IStream 接口):
只有普通的 System.IO.Stream 流不实现 IStream COM 接口,为了使用它们,您必须实现自己的某种包装器。可以从 .NET 源中借用