Название не совсем отражает суть проблемы.Ошибка компиляции при попытке возврата PChar или OleVariant для UDF
У меня есть функция UDF, которая возвращает PChar.
function AccountDescription(sAccountId: PChar) : PChar; stdcall;
Это работало нормально, но я понял, что хочу вернуть # N/A, если accountId не был найден.
Я обнаружил CVErr (xlErrNA) и изменил подпись, чтобы вернуть OleVariant. Но теперь я получаю [Ошибка] Несовместимые типы: «OleVariant» и «PAnsiChar».
Я не мог найти информацию о том, как решить эту проблему, поэтому я считаю, что мое понимание проблемы не должно быть правильным.
Я попытался просто передать строку, которая скомпилировала, но произвела ошибку времени выполнения «Недопустимый тип варианта».
Полный код:
function AccountDescription(sAccountId: PChar): OleVariant; stdcall;
var
strResult: string;
strPChar : PChar;
begin
try
strResult:= repo.GetAccount(sAccountId).Description;
strPChar := strAlloc(length(strResult)+1) ;
StrPCopy(strPChar, strResult) ;
Result := strPChar;
except
Result := CVErr(xlErrNA);
end;
end;
Примечание: Является ли первенствует ответственность за уничтожение строки или в том, что мой очистки? Должен ли я создавать копию или я должен просто возвращать указатель на существующую строку. После ввода текста я чувствую, что должен возвращать указатель.
Обновление: В этом примере был удален какой-то нерелевантный код.
Теперь с помощью:
function AccountDescription(sAccountId: PChar): OleVariant; stdcall;
var
strResult: string;
begin
try
Result := PChar(repo.GetAccount(sAccountId).Description);
except
Result := CVErr(xlErrNA);
end;
end;
Таким образом, моя текущая надстройка уже имеет утечку памяти. Когда я переключился между созданием копии PChar и Результат: = PChar (repo.GetAccount (sAccountId) .Description); У меня такой же объем утечки памяти. Поэтому у меня возникают проблемы в других местах, когда дело доходит до утечки памяти. –
Я проследил утечку памяти и исправил ее и повторно протестировал. Теперь я вижу, что я пропущу память, сделав копию. Когда я переключаюсь на PChar (.... Описание), я прекращаю утечку памяти. Описание происходит из репо, которое находится в памяти. –
Все еще не может понять, как вернуть строку или ошибку. –