(23:47:16) Алексей1153++: Kivals, в общем, ситуация такая - читаю теорию по COM , пока не всё переварил. А заказчик хочет побыстрее, поэтому самый быстрый сейчас вариант - добывать адресА функций и вызывать напрямую (описание параметров я заку предоставлю)
Это возможно ?
(23:47:36) Алексей1153++: в смысле - вызвать из 1С
(23:48:14) Алексей1153++: параметры все простые - int , void
(23:48:19) Kivals: Возможно, но нужно изучить доку по DynWrap
http://www.script-coding.com/dynwrap.html(23:48:48) Kivals: она простая (по ссылке в разделе по 1С) и примеров достаточно
(23:49:30) Алексей1153++: так у меня нет 1С и нет справки по ней (
(23:50:02) Алексей1153++: поэтому я не представляю, как мне правильно DLL оформить, чтобы можно всё было без проблем вызвать
(23:50:29) Алексей1153++: кстати, строку мне тоже надо будет передавать и возвращать
(23:50:35) Kivals: я имею в виду справку по DynWrap. Код 1С будет достаточно прост (щас накидаю)
(23:50:47) Алексей1153++: причём она там юникодная
(23:50:48) Kivals: Судя по доке - строки умеет
(23:51:14) Алексей1153++: ок
(23:51:18) Kivals: Возможные типы данных:
const ARGTYPEINFO ArgInfo[] =
{
{'a', sizeof(IDispatch*), VT_DISPATCH}, // a IDispatch*
{'c', sizeof(unsigned char), VT_I4}, // c signed char
{'d', sizeof(double), VT_R8}, // d 8 byte real
{'f', sizeof(float), VT_R4}, // f 4 byte real
{'k', sizeof(IUnknown*), VT_UNKNOWN}, // k IUnknown*
{'h', sizeof(long), VT_I4}, // h HANDLE
{'l', sizeof(long), VT_I4}, // l long
{'p', sizeof(void*), VT_PTR}, // p pointer
{'s', sizeof(BSTR), VT_LPSTR}, // s string
{'t', sizeof(short), VT_I2}, // t short
{'u', sizeof(UINT), VT_UINT}, // u unsigned int
{'w', sizeof(BSTR), VT_LPWSTR}, // w wide string
}
Примечание: для строк в некоторых случаях работает тип 'r' VT_BYREF (передача по ссылке).
(23:51:43) Kivals: скорее всего у тебя для строк будет тип w
(23:51:52) Алексей1153++: это что
(23:51:56) Kivals: Напиши сюда заголовок функции с параметрами
(23:52:11) Kivals: Кста: а 1С у заказчика какая?
(23:52:24) Kivals: А то создание объекта будет отличаться немного
(23:54:28) Алексей1153++: типы такие
typedef int (WINAPI *tdf_TMV1C_Interface__CreateInstance )();
typedef void (WINAPI *tdf_TMV1C_Interface__ShowDialog )(int,int);
typedef void (WINAPI *tdf_TMV1C_Interface__ReleaseInstance )(int);
typedef void (WINAPI *tdf_TMV1C_Interface__SomeF1 )(const WCHAR*,int);//передать строку
typedef void (WINAPI *tdf_TMV1C_Interface__SomeF2 )(const WCHAR*,int); //вертать строку
(23:55:10) Алексей1153++: версию не знаю. Скорее 7 , но может и 8
(00:00:48) Алексей1153++: может мне сделать тестовую длл, которая будет мессаджи показывать ?
(00:00:51) Kivals: Для 7.7 для первых 2х функций как-то так:
CreateInstance = CreateObject("DynamicWrapper");
CreateInstance.Register("dllname.dll", "tdf_TMV1C_Interface__CreateInstance", "i=", "f=s", "r=l");
Res = CreateInstance();
ShowDialog = CreateObject("DynamicWrapper");
ShowDialog.Register("dllname.dll", "tdf_TMV1C_Interface__ShowDialog", "i=ll", "f=s", "r=l");
ShowDialog(100, 100);
(00:01:27) Алексей1153++: а энтот DynamicWrapper - он у них обычно установлен уже ?
(00:02:09) Kivals: не - скачать и зарегистрировать нужно. Это сторонняя компонета.
Можешь в свой инсталятор добавить, если прога с интсалятором поставляется
(00:02:14) Алексей1153++: "i=", "f=s", "r=l" - это как разобрать
(00:03:01) Kivals: Для 8.Х вместо
CreateInstance = CreateObject("DynamicWrapper");
будет
CreateInstance = New ComObject("DynamicWrapper");
И так для каждой функии - вот и все различия.
(00:03:29) Алексей1153++: ок, спасибо
(00:03:38) Kivals: Там же в ссылке есть описание:
http://www.script-coding.com/dynwrap.html(00:04:08) Kivals: Параметры при объявлении содержат имя библиотеки, имя функции, а также:
i - описывает количество и тип данных параметров функции. Если функция не принимает параметры, этот параметр можно опустить. Параметр i является строкой, количество букв в которой равно количеству параметров объявляемой функции. Первая буква задаёт тип первого параметра, вторая - втрого и т.д.
f - тип вызова: _stdcall, _cdecl и т.д. Значение по умолчанию - _stdcall. Возможные значения параметра:
'm' - DC_MICROSOFT 0x0000, Default
'b' - DC_BORLAND 0x0001, Borland compat
's' - DC_CALL_STD 0x0020, __stdcall
'c' - DC_CALL_CDECL 0x0010, __cdecl
'4' - DC_RETVAL_MATH4 0x0100, Return value in ST
'8' - DC_RETVAL_MATH8 0x0200, Return value in ST
r - тип возвращаемых данных.
(00:05:41) Алексей1153++: угу, понятно. Щас почитаю
(00:06:07) Kivals: Давай.
Если что - пиши дальше в тему
(00:06:50) Алексей1153++: а, то есть сначала как бы декларация функций
(00:06:59) Алексей1153++: а потом их можно вызывать привычно
(00:07:05) Kivals: угу, именно
(00:07:14) Алексей1153++: Const WM_GETTEXT = &HD
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "USER32.DLL", "GetForegroundWindow", "f=s", "r=l"
Wrap.Register "USER32.DLL", "SendMessage", "i=lllr", "f=s", "r=l"
Title = Space(100)
res = Wrap.SendMessage(Wrap.GetForegroundWindow(), WM_GETTEXT , 100, Title)
MsgBox Title
(00:07:43) Алексей1153++: ну усё, смысл понятен, благодарю )
(00:07:47) Kivals: Т.е. для COM объектов эта декларация вшита в dll, а для обычных dll ты должен сам про нее позаботиться
Осуществляется регистрация выхода...
Project : error PRJ0050: ЌҐ г¤ «®бм § ॣЁбваЁа®ў вм ўл室. “ЎҐ¤ЁвҐбм, зв® г ў б Ґбвм Ґ®Ўе®¤Ё¬лҐ а §аҐиҐЁп Ё§¬ҐҐЁҐ ॥бва .