使用 dfshim.dll 控制非托管C++中的 ClickOnce 应用程序



我刚刚发现窗口中有一个最小的非托管 API 用于 ClickOnce 应用程序,位于 dfshim.dll 中。不幸的是,我只能在MSDN上找到一个非常不完整的文档:http://msdn.microsoft.com/en-us/library/bb629396.aspx

网络上的参考资料很少。它们都通过执行命令行来使用 rundll32.exe 调用 DLL 的函数来使用 DLL。

我想从C++代码调用 DLL 的函数。我没有找到要包含的头文件或要链接的存根文件。

我可以在运行时显式加载 DLL 并手动解析函数符号,但这对于 Windows API 来说似乎并不常见。此外,我还需要猜测许多函数的签名。

如何在 Visual Studio 2013 中使用该 DLL?为什么没有包含文件?这实际上是一个官方/公共 API 吗?

奇怪的是,这段代码几乎没有记录。

我们最终得到了这段代码:

bool    LaunchClickOnceApplication(LPCSTR pszApplication)
{
HRESULT hr(-1);
HINSTANCE hInst = ::LoadLibrary("dfshim.dll");
if ( hInst )
{
    typedef HRESULT (WINAPI *dfshim_LaunchApplicationProc) (LPCWSTR pszApplication, LPVOID pData, DWORD dwFlags);
    dfshim_LaunchApplicationProc fnLaunch = (dfshim_LaunchApplicationProc)GetProcAddress(hInst, "LaunchApplication");
    if ( fnLaunch )
    {
        hr = fnLaunch(CA2W(pszApplication), NULL, 0);
    }
    ::FreeLibrary(hInst);
    return SUCCEEDED(hr);
}
else
{
    DWORD dwErr = ::GetLastError();
    char szMsg[128];
    _snprintf_s(szMsg, sizeof(szMsg), _TRUNCATE, "Cannot load dfshim.dll: %lu", dwErr);
    AfxMessageBox(szMsg);
    return false;
}
}

不依赖文档有点不专业。它更像是一个黑客,但我看不到其他方法。这段代码对我们有用。

最新更新