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

C++ 在非托管C+;中使用dfshim.dll控制ClickOnce应用程序+;,c++,dll,clickonce,C++,Dll,Clickonce,我刚刚发现windows中ClickOnce应用程序有一个最小的非托管API,它位于dfshim.dll中。不幸的是,我只能找到一份关于MSDN的非常不完整的文档: 网上只有很少的参考资料。他们都通过执行命令行使用rundll32.exe调用DLL的函数来使用DLL 我想从C++代码中调用DLL函数。我没有找到要包含的头文件或要链接的存根文件 我可以在运行时显式地加载DLL并手动解析函数符号,但这对于Windows API来说似乎非常少见。我还需要猜测许多函数的签名 如何在Visual Stud

我刚刚发现windows中ClickOnce应用程序有一个最小的非托管API,它位于
dfshim.dll
中。不幸的是,我只能找到一份关于MSDN的非常不完整的文档:

网上只有很少的参考资料。他们都通过执行命令行使用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;
}
}
不依赖文档是不专业的。这更像是一种黑客行为,但我看不到其他方法。这个代码对我们有用