# Integrate SDK into Your App The Zoom Windows Video SDK allows you to add real-time voice, video and chat capabilities to your app. ## Prerequisites - [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/) or later - Windows Desktop Application: "Desktop development with C++" workload - Windows version 10 or above - Valid SDK Credentials ## Set up development environment 1. Open your project in Visual Studio and select your solution. 2. Set the Solution configuration to `release`. The SDK does not support `debug` builds. 3. To ensure the annotation on the Windows shared view has the correct position, set the Windows **DPI Awareness** project property to **Per Monitor High DPI Aware**. See [Setting the default DPI awareness for a process](https://learn.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process) for Win32 apps for details. ## Import the SDK library Download the Video SDK by creating an SDK app on the Zoom Marketplace. The downloaded folder includes three folders: - `bin` — Includes `videosdk.dll` and its dependent Libraries. - `h` — SDK's external header files. - `lib` — `videosdk.lib` Navigate to **Project** -> "**YourProjectName"** Properties 1. Select C/C++ -> General -> Additional Include Directories. Add the `h` folder. 2. Select C/C++ -> General -> Debug Information Format. Set to "None". 3. Select Linker -> General -> Additional Library Directories. Add the `lib` folder. 4. Select Linker -> Input -> Additional Dependencies -> Add `videosdk.lib`. ## Initialize the SDK The SDK requires initialization before you can call any other functions. To initialize, create an instance of `IZoomVideoSDK` using `CreateZoomVideoSDKObj()`. Note that you must call the Video SDK from the main thread. ```cpp IZoomVideoSDK* m_pVideoSDK; m_pVideoSDK = CreateZoomVideoSDKObj(); ``` Create an instance of `ZoomVideoSDKInitParams` and specify the initialization parameters. ```cpp ZoomVideoSDKInitParams initParams; // Set network domain initParams.domain = L"https://zoom.us"; // Set raw data memory mode initParams.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeStack; initParams.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeStack; initParams.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeStack; // Set to enable indirect raw data initParams.enableIndirectRawdata = false; // Set to enable SDK logging initParams.enableLog = true; // Set to specify the prefix of the log file name initParams.logFilePrefix = L"prefix"; ``` Call the `initialize` function on the `IZoomVideoSDK` object and pass in the `ZoomVideoSDKInitParams` object. ```cpp int returnVal = m_pVideoSDK->initialize(initParams); if (returnVal != ZoomVideoSDKErrors_Success) { // Call to initialize failed. Inspect returnVal to see error. return; } ``` Once the SDK is successfully initialized, you will be able to call the SDK functions. You can set up a listener for events such as when a user joins a session or leaves a session. ### Initialize with debug log You can enable the debug log feature when initializing the SDK with the following method: ```cpp ZoomVideoSDKInitParams init_params; init_params.domain = _T("https://go.zoom.us"); init_params.enableLog = true; init_params.logFilePrefix = _T("zoom_win_video_demo"); init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap; init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap; init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap; init_params.enableIndirectRawdata = false; ZoomVideoSDKMgr::GetInst().Init(this, init_params); ``` Once you've initialized the log feature, the SDK creates an encrypted `.log` file at `C:\Users\UserName\AppData\Roaming\ZoomSDK\logs` The log file has a 5MB fixed maximum storage capacity. Once it reaches the maximum capacity, it automatically re-records from the beginning and overrides the previous data. ## Listen for callback events `IZoomVideoSDKDelegate` allows you to subscribe to callback events that provide status updates on the operations performed in your app that are related to the SDK. For example, you may want to receive notifications when a user has successfully joined or left a session. ## Implement a delegate To subscribe to these events, you must have your class inherit from the `IZoomVideoSDKDelegate` interface. This section will show you how to implement this delegate and assign it to the SDK instance and provide you with examples of the event handlers associated with the SDK. **Add instance of `IZoomVideoSDKDelegate` to `IZoomVideoSDK` instance** ```cpp // CExampleListener.h class CExampleListener: IZoomVideoSDKDelegate { // ... private: IZoomVideoSDK* m_pVideoSDK; // ... } // CExampleListener.cpp m_pVideoSDK->addListener(this); ``` ## Callback functions The following examples show the various callback functions that are provided by the **Video SDK**. You can use these functions and implement any additional operations as needed after receiving the callback function result. **Get notified of operation results and SDK errors** ```cpp void CExampleListener::onError(ZoomVideoSDKErrors errorCode, int detailErrorCode) { CString info; switch(errorCode) { case ZoomVideoSDKErrors_Meeting_Disconnecting: info.Format(_T("onError(): Disconnecting from session, Error:%d DetailCode: %d"), errorCode, detailErrorCode); break; case ZoomVideoSDKErrors_Meeting_Reconnecting: info.Format(_T("onError(): Reconnecting to session, Error:%d DetailCode: %d"), errorCode, detailErrorCode); break; case ZoomVideoSDKErrors_Meeting_Join_Failed: info.Format(_T("onError(): Failed to join session, Error:%d DetailCode: %d"), errorCode, detailErrorCode); break; default: info.Format(_T("onError(): Error:%d DetailCode: %d"), errorCode, detailErrorCode); break; } } ``` ## Add features See details on features and other callback functions in the **Add features** sections for **Video**, **Audio**, and others. See [Error codes](/docs/video-sdk/windows/error-codes/) for a list of error codes, descriptions, and troubleshooting suggestions.