Использование dfshim.dll для управления приложениями ClickOnce в неуправляемом переполнении стека

Я только что узнал, что существует минимальный неуправляемый API для приложений ClickOnce в окнах, который находится в dfshim.dll, К сожалению, я мог найти только очень неполную документацию по MSDN: http://msdn.microsoft.com/en-us/library/bb629396.aspx

В Интернете очень мало ссылок. Все они используют DLL, выполняя командные строки для вызова функций DLL, используя rundll32.exe.

Я хотел бы вызвать функции DLL из кода C ++. Я не нашел заголовочный файл для включения или заглушки для ссылки.

Я мог бы явно загрузить DLL во время выполнения и вручную разрешить символы функций, но это кажется довольно редким явлением для Windows API. Также мне нужно угадать сигнатуру для многих функций.

Как я могу использовать эту DLL с Visual Studio 2013? Почему нет включаемого файла? Это на самом деле официальный / публичный API?

1

Решение

Странно, этот код вряд ли документирован.

мы оказались в этом коде:

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

Это непрофессионально — не полагаться на документацию. Это больше похоже на взлом, но я не вижу альтернативного пути. Этот код работает для нас.

0

Другие решения