|
|
#include <windows.h>
#include <wininet.h>
#include <shlwapi.h>
#include <icwacct.h>
#include "dllmain.h"
#include "acctreg.h"
#define ARRAYSIZE(_exp_) (sizeof(_exp_) / sizeof(_exp_[0]))
CAcctReg::CAcctReg() { m_cRef = 1; DllAddRef(); }
CAcctReg::~CAcctReg() { DllRelease(); }
ULONG CAcctReg::AddRef(void) { return ++m_cRef; }
ULONG CAcctReg::Release(void) { if (--m_cRef==0) { delete this; return 0; } return m_cRef; }
HRESULT CAcctReg::QueryInterface(REFIID riid, void **ppvObject) { if(!ppvObject) return E_INVALIDARG;
*ppvObject = NULL;
if (IsEqualIID(riid, IID_IDispatch)) *ppvObject = (IDispatch *)this; else if (IsEqualIID(riid, IID_IUnknown)) *ppvObject = this; else return E_NOINTERFACE;
AddRef(); return NOERROR; }
HRESULT CAcctReg::GetTypeInfoCount(UINT *pctinfo) { return E_NOTIMPL; }
HRESULT CAcctReg::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo) { return E_NOTIMPL; }
HRESULT CAcctReg::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid) { if (cNames == 1 && lstrcmpW(rgszNames[0], L"register") == 0) { rgdispid[0] = 666; return S_OK; }
return E_NOTIMPL; }
HRESULT RegisterAccounts(LPSTR pszFile) { HRESULT hr; HINSTANCE hinst; HKEY hkey; char szDll[MAX_PATH], szExpand[MAX_PATH]; LPSTR psz; DWORD cb, type; PFNCREATEACCOUNTSFROMFILE pfn;
hr = E_FAIL;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Internet Account Manager", 0, KEY_QUERY_VALUE, &hkey)) { cb = sizeof(szDll); if (ERROR_SUCCESS == RegQueryValueEx(hkey, "DllPath", NULL, &type, (LPBYTE)szDll, &cb)) { if (type == REG_EXPAND_SZ) { ExpandEnvironmentStrings(szDll, szExpand, ARRAYSIZE(szExpand)); psz = szExpand; } else { psz = szDll; }
hinst = LoadLibrary(psz); if (hinst != NULL) { pfn = (PFNCREATEACCOUNTSFROMFILE)GetProcAddress(hinst, "CreateAccountsFromFile"); if (pfn != NULL) { hr = pfn(pszFile, 0); }
FreeLibrary(hinst); } }
RegCloseKey(hkey); }
return(hr); }
#define CBBUFFER 1024
BOOL CreateLocalFile(HINTERNET hfile, LPCSTR pszFile) { BOOL fRet; HANDLE hfileLocal; LPBYTE pb; DWORD dw, dwT;
fRet = FALSE;
pb = (LPBYTE)malloc(CBBUFFER); if (pb != NULL) { hfileLocal = CreateFile(pszFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hfileLocal != INVALID_HANDLE_VALUE) { while (InternetReadFile(hfile, pb, CBBUFFER, &dw)) { if (dw == 0) { fRet = TRUE; break; }
if (!WriteFile(hfileLocal, pb, dw, &dwT, NULL)) break; }
CloseHandle(hfileLocal);
if (!fRet) DeleteFile(pszFile); }
free(pb); }
return(fRet); }
HRESULT CAcctReg::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pvarResult, EXCEPINFO *pexcepinfo, UINT *puArgErr) { HRESULT hr; HINTERNET hnet, hfile; LPSTR pszSrc, pszFile; char szPath[MAX_PATH], szDest[MAX_PATH]; int cch; DWORD dw;
if (dispidMember == 666 && pdispparams->cArgs == 1 && pdispparams->rgvarg[0].vt == VT_BSTR && pdispparams->rgvarg[0].bstrVal) { hr = E_FAIL;
cch = WideCharToMultiByte(CP_ACP, 0, pdispparams->rgvarg[0].bstrVal, -1, NULL, 0, NULL, NULL); cch++; pszSrc = (LPSTR)malloc(cch); if (pszSrc != NULL) { WideCharToMultiByte(CP_ACP, 0, pdispparams->rgvarg[0].bstrVal, -1, pszSrc, cch, NULL, NULL);
if (GetTempPath(sizeof(szPath), szPath) && GetTempFileName(szPath, "ins", 0, szDest) != 0) { hnet = InternetOpen("Outlook Express", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (hnet != NULL) { hfile = InternetOpenUrl(hnet, pszSrc, NULL, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0); if (hfile != NULL) { if (CreateLocalFile(hfile, szDest)) { hr = RegisterAccounts(szDest); DeleteFile(szDest); }
InternetCloseHandle(hfile); }
InternetCloseHandle(hnet); } }
free(pszSrc); }
return(S_OK); }
return E_NOTIMPL; }
|