Where is Steinberg::Vst::EditControllerEx1

Where is Steinberg::Vst::EditControllerEx1.


_editController = _plugProvider->getController();

		_name = classInfo.name();

		FClassID fuid = EditControllerEx1::getFClassID();
		EditControllerEx1* ex1;
		if (SUCCEEDED(_editController->queryInterface(fuid, (void**)&ex1))) {
			std::wcout << "queryInterface controller OK1" << std::endl;
		}
		else {
			std::wcout << "queryInterface controller NG1" << std::endl;
		}

IT not worked… help… Please.

Is it answer?

		Steinberg::Vst::IUnitInfo* unitInfo;
		if (SUCCEEDED(_editController->queryInterface(Steinberg::Vst::IUnitInfo::iid, (void**)&unitInfo))) {
			std::wcout << "uUnitInfo ok" << std::endl;
			unitInfo->addRef();
			for (int i = 0; i < unitInfo->getProgramListCount(); ++i) {
				Steinberg::Vst::ProgramListInfo info = {};
				if (SUCCEEDED(unitInfo->getProgramListInfo(i, info))) {
					std::wcout << " Program List " << std::to_wstring(i) << " = " << (const wchar_t*)info.name << std::endl;
				}
				else {
					std::wcout << " Program List " << std::to_wstring(i) << L" = NULLPO " << std::endl;
					continue;
				}
				int count = info.programCount;

				char name[512];
				Steinberg::Vst::String128  attr;

				for (int x = 0; x < count; ++x) {
					unitInfo->getProgramName(info.id, x, attr);
					std::wcout << L" Program[" << std::to_wstring(i) << L"]" << (const wchar_t*)attr << std::endl;
				}
			}
			unitInfo->release();
		}
		else {
			std::wcout << "uUnitInfo not ok" << std::endl;
		}

on KORG M1

 Program[15]Program 105
 Program[15]Program 106
 Program[15]Program 107
 Program[15]Program 108
 Program[15]Program 109
 Program[15]Program 110
 Program[15]Program 111
 Program[15]Program 112
 Program[15]Program 113
 Program[15]Program 114
 Program[15]Program 115
 Program[15]Program 116
 Program[15]Program 117
 Program[15]Program 118
 Program[15]Program 119
 Program[15]Program 120
 Program[15]Program 121
 Program[15]Program 122
 Program[15]Program 123
 Program[15]Program 124
 Program[15]Program 125
 Program[15]Program 126
 Program[15]Program 127
 Program[15]Program 128

hmm, and, anyone know, how to switch program Number from handled MIDI ProgCHG Message.
Im building Program like VST -Hosting.,

Im trying to handle Outside->MIDI->ProgramChange=>VST Programchange.

Thank you.

Checked code of

Ok kProgamId will help me.
Trying…

But, Still Crush.
Anyone could help me? please.

void EasyVstCustom::programChange(int which, int program) {
	double newProgram = program;
	std::wcout << L"program " << program << std::endl;
	_editController->setParamNormalized(_programParameterID, newProgram);
	std::wcout << L"new program " << newProgram << std::endl;
	Steinberg::Vst::ParameterChanges* changed = parameterChanges(kInput, which);
	std::wcout << L"changed " << changed << std::endl;
	if (changed != nullptr) {
		Steinberg::int32 retIndex;
		std::wcout << L"adding " << _programParameterID << " >>>> " << which << std::endl;
#if 1 // but crush
		IParamValueQueue*  queue = changed->addParameterData(_programParameterID, which);
		std::wcout << L"queue " << queue << std::endl;
		if (queue != nullptr) {
			queue->addPoint(0, newProgram, retIndex);
		}
#endif
		std::wcout << L"Program changed" << std::endl;
	}
	else {
		std::wcout << L"Cant add parameter" << std::endl;
	}
}

Thank you . I got information from some Web-Site. And Did it.

header

	ParamID _programParameterID[16];
	UnitID _programUnitID[16];

Prepare

				int idx, num = _editController->getParameterCount();
				int ch = 0;
				for (idx = 0; idx < num; ++idx) {
					if (_editController->getParameterInfo(idx, _paramInfo) == kResultOk
						&& (_paramInfo.flags & ParameterInfo::kIsProgramChange) != 0) {
						_programParameterID[ch]  = _paramInfo.id;
						_programUnitID[ch] = _paramInfo.unitId;
						std::cout << "***** programParameterId " << std::to_string(ch) << " = " << _programParameterID[ch] << std::endl;
						ch++;
					}
				}

Invoke

void EasyVstCustom::postProgramChange(int which, int channel, int program) {
	BusDirection direction = kOutput;

	std::cout << "Program Change : " << channel << " = " << program << std::endl;
	double newProgram;
	newProgram = _editController->plainParamToNormalized(_programParameterID[channel], program);
	ParameterChanges* changed = parameterChanges(kInput, which);
	if (changed != nullptr) {
		Steinberg::int32 retIndex = 0;
		IParamValueQueue* queue = changed->addParameterData(_programParameterID[channel], retIndex);
		if (queue != nullptr) {
			std::cout << " > Q > " << " <= " << std::to_string(newProgram) << std::endl;
			queue->addPoint(0, newProgram, retIndex);
		}
	}
	else {
		std::wcout << L"Cant add parameter" << std::endl;
	}
}

And here is my progressing Project (JavaGUI based VSTi Host and VST,UWP DLL for Widows10)

And, excuse me.
Asking…

Should I contain License File for my OpenSourceDistribute Zip file (Steinberg’s text file)