Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.221.163] |
|
Сообщ.
#1
,
|
|
|
Приве всем.
У ме5ня такая задача. Один проект наклевывается но я не знаю с чего начать. У меня задача написать дополнение для 1с. И мне надо знать как ето вообще делается. Насколько я знаю, должно быть что-то в духе 1с sdk . Такаяы вещь вообще есть ? Может кто-то уже писал подобные вещи и знает как соединить с++ и, собственно само 1с ? Заранее благодарен. |
Сообщ.
#2
,
|
|
|
Я тут в ФАК по Срр статейку добавил - это то что тебе нужно
Работа с 1C Предприятием из Visual C++ Это если ты хочешь из Спп вызывать 1С. А если наоборот - то тогда используй механизм внешних компонент - этот вопрос здесь уже неоднократно рассматривался |
Сообщ.
#3
,
|
|
|
2 AQL
У меня "_variant_t" вызывает ошибку при компиляции Дословно Цитата : error C2065: '_variant_t' : undeclared identifier ,а почему? Вернее че делать, че заинклудить |
Сообщ.
#4
,
|
|
|
Заинклуд comdef.h
|
Сообщ.
#5
,
|
|
|
когда-то давно выкопал такую функцию(не помню где) обертку Invoke, но жизнь упрощает
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) { // Begin variable-argument list... va_list marker; va_start(marker, cArgs); if(!pDisp) { MessageBox(NULL, "NULL IDispatch passed to AutoWrap()", "Error", 0x10010); return E_FAIL; } // Variables used... DISPPARAMS dp = { NULL, NULL, 0, 0 }; DISPID dispidNamed = DISPID_PROPERTYPUT; DISPID dispID; HRESULT hr; char buf[256]; char szName[256]; // Convert down to ANSI WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL); // Get DISPID for name passed... hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID); if(FAILED(hr)) { sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr); MessageBox(NULL, buf, "AutoWrap()", 0x10010); return hr; } // Allocate memory for arguments... VARIANT *pArgs = new VARIANT[cArgs+1]; // Extract arguments... for(int i=0; i<cArgs; i++) { pArgs[i] = va_arg(marker, VARIANT); } // Build DISPPARAMS dp.cArgs = cArgs; dp.rgvarg = pArgs; // Handle special-case for property-puts! if(autoType & DISPATCH_PROPERTYPUT) { dp.cNamedArgs = 1; dp.rgdispidNamedArgs = &dispidNamed; } // Make the call! hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL); if(FAILED(hr)) { sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr); MessageBox(NULL, buf, "AutoWrap()", 0x10010); return hr; } // End variable-argument section... va_end(marker); delete [] pArgs; return hr; } Пример использования: VARIANT v; VariantInit(&v); AutoWrap(DISPATCH_PROPERTYGET, &v, pv77, L"RMTrade", 0); IDispatch pRMTrade=v.pdispVal; P.S. по хорошему, должна быть type library, чтобы через IDispatch не мучаться, а работать с vtbl |
Сообщ.
#6
,
|
|
|
Здесь рассматривается одна из технологий, а есть еще одна - "Загрузка внешних компонент" с помощью функции ЗагрузитьВнешнююКомпоненту() можно загрузить внешнюю dll, но вот информацию по этой теме собрать сложно.
Такой способ не пробовали? |
Сообщ.
#7
,
|
|
|
Это где то тут недалеко пробегало
Докментация |