Будучи новичком в Delphi, я столкнулся с проблемой внешнего API.
Этот внешний API ожидает параметр с одним или двумя значениями, который я назвал побитовым параметром.
В Delphi это делается набором
Основным является перечисление.
TCreateImageTask = (
citCreate = 1,
citVerify
);
Это я положил в набор:
TCreateImageTasks = set of TCreateImageTask
В функции я заполняю этот набор:
function TfrmMain.GetImageTask: TCreateImageTasks;
begin
Result:=[];
if chkCreate.checked then Include(Result, citCreate);
if chkVerify.checked then Include(Result, citVerify);
end;
Теперь я должен передать эту задачу внешней DLL, написанной на C ++.
DLL ожидает значение __ int8 . Может содержать одну или две задачи TCreateImageTasks. В C ++ сделано:
__int8 dwOperation = 0;
if (this->IsDlgButtonChecked(IDC_CHECK_CREATE))
{
dwOperation = BS_IMGTASK_CREATE;
}
if (this->IsDlgButtonChecked(IDC_CHECK_VERIFY))
{
dwOperation |= BS_IMGTASK_VERIFY;
}
int32 res = ::CreateImage(cCreateImageParams, dwOperation);
Так что мне нужно преобразовать мой набор в целое число. Я делаю по
function TfrmMain.SetToInt(const aSet;const Size:integer):integer;
begin
Result := 0;
Move(aSet, Result, Size);
end;
я звоню с
current task := GetImageTask;
myvar := SetToInt(currentTask, SizeOf(currentTask));
Проблема, с которой я столкнулся сейчас, заключается в том, что myvar равен 6, когда 2 значения находятся внутри набора, 2, если только create, находятся внутри набора, и 4, если только проверка находятся внутри набора. Мне это не кажется правильным, и внешние библиотеки DLL не знают этих значений.
Где моя вина?