Dynamic Call с исходниками или поищи на форуме или в Интернете DynaCall или DynaWrap.
Оттуда:
const ARGTYPEINFO ArgInfo[] =
{
{'c', sizeof(unsigned char), VT_UI1}, // cC BYTE bVal
{'i', sizeof(short), VT_I2}, // iI SHORT iVal
{'l', sizeof(long), VT_I4}, // lL LONG lVal
{'h', sizeof(long), VT_I4}, // hH HANDLE lVal
{'u', sizeof(UINT), VT_I4}, // uU UINT lVal
{'f', sizeof(float), VT_R4}, // fF FLOAT fltVal
{'d', sizeof(double), VT_R8}, // dD DOUBLE dblVal
{'b', sizeof(VARIANT_BOOL), VT_BOOL}, // bB VARIANT_BOOL boolVal
{'k', sizeof(IUnknown*), VT_UNKNOWN}, // kK LPUNKNOWN punkVal
{'o', sizeof(IDispatch*), VT_DISPATCH}, // oO LPDISPATCH pdispVal
{'s', sizeof(LPSTR), VT_LPSTR}, // sS string bstrVal
{'w', sizeof(LPWSTR), VT_LPWSTR}, // wW wstring bstrVal
{'v', sizeof(VARIANT), VT_VARIANT}, // vV VARIANT pvarVal
{'t', sizeof(DATE), VT_DATE}, // tT DATE date
{'p', sizeof(void*), VT_BYREF}, // pP pointer byref
{'r', sizeof(LPSTR), VT_LPSTR}, // rR out string same as S
};
Поэтому BOOL GetCPUName(LPWSTR lpszCpuName, SIZE_T Size) обработается как
- Код: Выделить всё
With CreateObject("DynamicWrapper")
.Register "C++.DLL", "GetCPUName", "F=MC", "I=WL", "R=L"
' ...
buff = 1000
xyz = String(buff, "")
.GetCPUName xyz, buff
End With
Возможно, придётся обработать С++ преобразованное имя: оно может быть достаточно сложным.