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

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

我想使用函数接口(interface)“IApplicationActivationManager” & 它的成员函数“IApplicationActivationManager::ActivateApplicationMSDN link

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

But I'm trying to understand what does IDL do - dunamic or static lining ? DO I need to provide any DLL/lib ? How does the lining happen ?

最佳答案

IApplicationActivationManager 是一种 COM 接口(interface)类型。 COM 对象总是在运行时动态创建,它们没有超出 ole32.lib 的链接要求,可能是定义对象 GUID 的 .lib。您使用通用 COM 对象工厂 CoCreateInstance() 获取接口(interface)指针。

一个示例可能会有所帮助,我将发布用于在 Windows 8 上激活天气应用程序的 Win32 控制台模式应用程序的代码。从提供的 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描述了如何发现它们。

关于c++ - IDL 文件 - 静态链接或动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28878515/

相关文章:

C++ VALGRIND 未初始化的值是由堆分配创建的

c++ - boost.variant派生类型: cannot use copy constructor

c++ - 将 MinGW64 库与 MSVC 2010 链接

c++ - 如何在 Visual Studio 2010 速成版上启用 C++11 编译器?

c++ - 未定义对链接库中 SDL2 函数的引用 (Code::Blocks)

c++ - C++20 模块中的静态库链接错误

c - gcc静态链接 undefined reference

c++ - 令人困惑的 C++ 编译器错误, "cannot convert ' X' 返回 'double'

c - C 和 D 中相同的_exact_代码会给出不同的结果——为什么?

c++ - 检查文件是否稀疏