我正在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);
。
有人可以向我解释这是为什么吗?
我认为在全局范围内声明变量足以使其成为全局变量。但是在这种情况下,它似乎也必须全局定义。
此声明:
TForm1 *Form2;
is Form2
的定义。问题是,它没有指向有效的内存,因此当您使用指向的值时,您将调用未定义的行为。 (在您的情况下,似乎什么都没发生,只是从未创建过表单/文本框)。