IDL文件 - 静态链接或动态链接

时间:2015-03-05 13:02:39

标签: c++ visual-c++ static-linking dynamic-linking idl

我想使用功能界面" IApplicationActivationManager" &它的成员函数" IApplicationActivationManager :: ActivateApplication "  MSDN link

它出现在Shobjidl.h& Shobjidl.idl。 我已经看到* .DLL或* .lib作为定义Microsoft函数的依赖项,所以我们知道它是静态链接还是动态链接。

  

但是我试图了解IDL做了什么 - dunamic或静态   衬里?我需要提供任何DLL / lib吗?衬里是如何发生的?

1 个答案:

答案 0 :(得分:2)

IApplicationActivationManager是一种COM接口类型。 COM对象总是在运行时动态创建,它们没有ole32.lib之外的链接要求,可能是定义对象GUID的.lib。您将获得具有通用COM对象工厂CoCreateInstance()。

的接口指针

示例可能有帮助,我将发布Win32控制台模式应用程序的代码,该应用程序在Windows 8上激活天气应用程序。从提供的VS项目模板创建项目。无需更改,模板已经链接了所需的一切(kernel32.lib,ole32.lib和uuid.lib)。

#include "stdafx.h"
#include <Windows.h>
#include <ShlObj.h>
#include <assert.h>

int main()
{
    auto hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    assert(SUCCEEDED(hr));
    IApplicationActivationManager* itf;
    hr = CoCreateInstance(CLSID_ApplicationActivationManager, NULL, 
                          CLSCTX_LOCAL_SERVER,
                          __uuidof(IApplicationActivationManager),
                          (void**)&itf);
    if (SUCCEEDED(hr)) {
        auto weatherApp = L"Microsoft.BingWeather_8wekyb3d8bbwe!App";
        DWORD dontuse;
        hr = itf->ActivateApplication(weatherApp,
                                      L"", AO_NONE, &dontuse);
        assert(SUCCEEDED(hr));
        itf->Release();
    }
    CoUninitialize();
    return 0;
}

您需要要激活的应用的应用用户型号ID,this MSDN page描述了如何发现它们。