zoom-plugin-sdk-windows
Zoom Plugin SDK for native Windows companion applications using C++, Win32, or MFC to control an installed Zoom Workplace client over IPC. Use for Visual Studio integration, OAuth initialization, list
SKILL.mdskills/plugin-sdk/windows/SKILL.md
GitHubZoom Plugin SDK for Windows
Use native C++ to control Zoom Workplace from a separate Windows desktop application.
Start Here
- Read Lifecycle and Integration.
- Use Package and API Map to locate the authoritative interface and sample dialog for a feature.
- Use Capabilities to check whether the official client can do the requested operation.
- Build the bundled
PSDKTestsample in the matching architecture. - Implement auth, IPC, and meeting-state callbacks before feature controls.
- Use Common Issues for build, runtime DLL, listener, permission, and compatibility failures.
Baseline Requirements
- A Zoom Marketplace General app with Plugin SDK enabled.
- A user OAuth access token containing
plugin_sdk:read:connection_meta. - Zoom Workplace
7.0.2or later according to the public setup documentation. - Visual Studio 2019 or later.
- A consistent x86 or x64 selection across headers, library, runtime DLLs, application, and Zoom Workplace compatibility.
Package review baseline: zoom-plugin-sdk-windows-7.1.0.2020.
Minimal Lifecycle
IZMToolSuiteProxyListener is a pure virtual interface in this package. Implement every required callback, even if most handlers are initially no-ops.
#include "ToolSuiteProxyInterface.h"
using namespace ZMToolSuiteProxy;
class PluginController : public IZMToolSuiteProxyListener {
public:
void Initialize(const std::wstring& accessToken) {
InitZMToolSuite();
ZMToolSuiteProxyAuthContext context;
context.domain = L"https://zoom.us";
context.accessToken = accessToken.c_str();
StartToolSuiteAuth(context);
SetToolSuiteProxyListener(this);
}
void Shutdown() {
UninitZMToolSuite();
SetToolSuiteProxyListener(nullptr);
}
void OnAuthResult(ZMToolSuiteProxyAuthResult result) override {}
void OnIPCConnectStatusChanged(
ZMToolSuiteIPCConnectStatus status,
std::string errorMessage
) override {}
void OnMeetingStatusChanged(ZMToolSuiteMeetingStatus status) override {}
// Implement the remaining pure virtual callbacks from
// ToolSuiteProxyInterface.h for the selected package version.
};
Keep the controller alive until after UninitZMToolSuite() and listener removal.
Start or Join
JoinMeetingParam join;
join.displayName = L"Display Name";
join.meetingNumber = 1234567890LL;
join.password = L"";
bool submitted = premeeting::GetPreMeetingToolkit()->JoinMeeting(
join,
[](const BaseResult& result) {
if (result.error_code != kZMToolSuiteProxyErrorsSuccess) {
return;
}
}
);
The Boolean reports whether the request was submitted. Use BaseResult.error_code and OnMeetingStatusChanged for the asynchronous outcome.
Implementation Guardrails
- Wait for
AUTH_RESULT_SUCCESSandIPC_STATUS_CONNECTEDbefore pre-meeting controls. - Wait for
MEETING_STATUS_INMEETINGbefore meeting toolkits. - Use the correct
ZMToolSuiteMeetingInstancefor default, green-room, or breakout-room contexts. - Check role, policy, and
Can*/IsSupport*methods before privileged actions. - Keep callback-owned pointers and vector data within their documented lifetime; copy data needed later.
- Marshal callback-driven UI changes to the application's UI thread.
- Ship the complete matching
bin/runtime dependency set beside the executable. - Do not embed an OAuth client secret in a distributed desktop binary.
Feature Routing
| Task | API family |
|---|---|
| Initialize/authenticate/uninitialize/listener | ToolSuiteProxyInterface.h |
| Start/join, settings window, URL navigation | premeeting::GetPreMeetingToolkit() |
| Status, properties, leave/end, statistics | meeting::GetMeetingToolkit(instance) |
| Roster, roles, permissions, host controls | meeting::GetParticipantsToolkit(instance) |
| Audio/video controls | meeting::GetAudioToolkit(instance) and GetVideoToolkit(instance) |
| App/window, monitor, camera, file, audio, frame, whiteboard share | meeting::GetShareToolkit(instance) |
| Recording, waiting room, chat, captions, Q&A, webinar | Matching meeting::Get*Toolkit(instance) |
| Device and processing settings | setting::GetSettingToolkit() |