2014-12-24 49 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; 
} 
} 

這是一種不專業不依賴於文件。它更像是一個黑客,但我沒有看到另一種方式。此代碼適用於我們。

相關問題