Я использую C++Builder начиная с версии 1.0 (1994 г.). Я использовал его до версии 2010. Недавно мы получили последнюю версию IDE «Embarcadero® C++Builder 12 Version 29.0.50491.5718».
Раньше я без проблем создавал множество объектов динамически, но теперь я хочу обновить старый проект и получаю ошибку, которую не могу исправить.
Я пытаюсь создать TCppWebBrowser
динамически (с использованием IDE работает отлично).
Мой код в основном таков:
void __fastcall TFormAdmin::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp,
Variant *URL)
{
//Here the event code
}
А в другой части кода — динамическое создание объекта:
TCppWebBrowser *CppWebBrowser1;
CppWebBrowser1=new TCppWebBrowser(this);
CppWebBrowser1->TOleControl::Parent = this;
CppWebBrowser1->OnDocumentComplete = CppWebBrowser1DocumentComplete;
Я получаю ошибку в этой строке:
CppWebBrowser1->OnDocumentComplete = CppWebBrowser1DocumentComplete;
[Ошибка bcc32] admin.cpp(78): E2034 Невозможно преобразовать 'void (_fastcall * (_closure)(TObject *,IDispatch *,Variant *))(TObject *,IDispatch *,Variant *)' в 'TCppWebBrowserDocumentComplete'
Когда я использую этот код с помощью IDE (создание и назначение объекта и события во время разработки), он работает отлично.
Прототип функции:
typedef void __fastcall (__closure * TCppWebBrowserDocumentComplete)(System::TObject * Sender,LPDISPATCH pDisp,VARIANT* URL);
Параметры те же, тип тот же.
Я не уверен, что делать. Я не понимаю, почему это работает во время разработки, но не программно.
Кажется, существует несоответствие между типом замыкания и сгенерированной функцией. Тип закрытия определяется как:
typedef void __fastcall (__closure * TCppWebBrowserDocumentComplete)(
System::TObject * Sender,
LPDISPATCH pDisp /*[in]*/,
VARIANT* URL /*[in]*/);
но сгенерированная функция использует Variant
вместо VARIANT
. По какой-то причине это работает для компонентов, которые вы добавляете в IDE, но не когда вы делаете это вручную. Решение состоит в том, чтобы изменить сигнатуру функции как в заголовочном файле, так и в файле .cpp
, чтобы она соответствовала:
class TForm1 : public TForm
{
void __fastcall CppWebBrowser1DocumentComplete(
TObject *Sender, LPDISPATCH pDisp, VARIANT *URL);
// ^^^^^^^
void __fastcall TForm1::CppWebBrowser1DocumentComplete(
TObject *Sender, LPDISPATCH pDisp, VARIANT *URL) {
// ^^^^^^^
По этому поводу я написал отчет об ошибке RSS-1314.
Это сработало. Спасибо :). Я этого не видел. Это любопытно, потому что если вы создадите его с помощью IDE, он создаст вариант, но работает. Возможно, в ide не учитывается регистр.
@Hamboy75 Отлично! Пожалуйста! Я просто предполагаю, но, возможно, привязка, сделанная из IDE, обходит проверку синтаксиса и что VARIANT
и Variant
на самом деле двоично совместимы. Я не копал слишком глубоко, но они по крайней мере одинакового размера.
@Hamboy75 Я написал отчет об ошибке embt.atlassian.net/servicedesk/customer/portal/1/RSS-1314 - Ты можешь его прочитать? Если да, то я тоже укажу это в ответе.
@TedLyngmo, когда я нажимаю на эту ссылку, я получаю сообщение об ошибке: «У вас нет разрешения на просмотр этого запроса».
@RemyLebeau О, это мой первый отчет об ошибках в новом QC. Кажется, мне нужно открыто поделиться этим с людьми — или это потому, что команда Embarcadero еще не официально открыла его.
@TedLyngmo Я сделаю это в понедельник
@TedLyngmo Сейчас я поделился этим с «Клиентами Embarcadero», а также добавил комментарий с более подробной информацией.
@RemyLebeau Большое спасибо! Теперь я включил ссылку в ответ.
Я попробую позже. Спасибо :)