2014-12-24 136 views
1

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

网络中只有很少的参考文献。他们都通过执行命令行来使用DLL来使用rundll32.exe来调用DLL的函数。

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

我可以在运行时明确加载DLL并手动解析函数符号,但对于Windows API来说这似乎很少见。此外,我需要猜测许多功能的签名。

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

回答

0

奇怪的是,这段代码很难记录。

我们在这个代码结束了:

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; 
} 
} 

这是一种不专业不依赖于文件。它更像是一个黑客,但我没有看到另一种方式。此代码适用于我们。

相关问题