Здравствуйте, A321, Вы писали:
A>Есть dll из VB, в которой наряду с СОМ-интерфейсами есть просто структура данных, которые эти интерфейсы соответственно и используют. VC сгенерила врапперы для СОМ-объектов, но отказалась для тех методов, которые используют эту структуру. Как ее можно все-таки им передавать?
A>Вот пример функции, которую я пытался сделать самостоятельно, но я так и не смог найти правильный параметр типа, все время run-time ругается на type mismatch
A>LPDISPATCH ICentSelect::Select(SelectInfo * info)
A>{
A>LPDISPATCH result;
A>static BYTE parms[] = VTS_PDISPATCH;
A>InvokeHelper(0x1, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, info);
A>return result;
A>}
Я бы перешел на #import, которая генерит более удобные классы и использует дуальность VB-ных интерфейсов.
Иначе через VARIANT, который будет содержать указатель на структуру.
LPDISPATCH ICentSelect::Select(VARIANT * vinfo)
{
LPDISPATCH result;
static BYTE parms[] = VTS_PVARIANT; // или VTS_VARIANT - тут я не совсем уверен
InvokeHelper(0x1, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, vinfo);
return result;
}
или сопряженный с трудностями получения IRecordInfo
LPDISPATCH ICentSelect::Select(SelectInfo * info[, IRecordInfo* pInfo = NULL])
{
LPDISPATCH result;
VARIANT vinfo;
V_VT(&vinfo) = VT_RECORD;
V_RECORD(&vinfo) = info;
// если pInfo == NULL, но нужно получить реальный IRecordInfo для структуры SelectInfo.
V_RECORDINFO(&vinfo) = pInfo;
static BYTE parms[] = VTS_VARIANT; // аналогично
InvokeHelper(0x1, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, &vinfo);
return result;
}