为什么我必须同时声明和定义我的表单以使其可以全局访问?

问题描述 投票:0回答:1

我正在C ++ Builder中编写一个DLL以与NodeJS一起使用。

Unit1.cpp像这样开始:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <Vcl.Styles.hpp>
#include <Vcl.Themes.hpp>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent *Owner)
    : TForm(Owner) {
}
//---------------------------------------------------------------------------
// exported standard C++ interface function that calls into VCL

TForm1 *Form2;

[有一个调用TForm1 *Form2 = new TForm1(NULL);Form2->ShowModal()的函数。它可以正常工作,并显示表单。

稍后会调用另一个函数,它将创建一个TEdit(文本框)作为Form2的子级,然后显示一条消息:ShowMessage("Done!")

但是该文本框实际上并未创建,尽管确实显示了消息框。获得此第二个函数来创建文本框的唯一方法是将Form2的定义移至文件顶部的全局范围内。换句话说,通过将TForm1 *Form1;替换为TForm1 *Form2 = new TForm1(NULL);

有人可以向我解释这是为什么吗?

我认为在全局范围内声明变量足以使其成为全局变量。但是在这种情况下,它似乎也必须全局定义。

c++ delphi dll c++builder vcl
1个回答
0
投票

此声明:

TForm1 *Form2;

is Form2的定义。问题是,它没有指向有效的内存,因此当您使用指向的值时,您将调用未定义的行为。 (在您的情况下,似乎什么都没发生,只是从未创建过表单/文本框)。

© www.soinside.com 2019 - 2024. All rights reserved.