Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.90.141] |
|
Сообщ.
#1
,
|
|
|
Доброе время суток
Помогите пожалуйста Написал свой компонент. Пытаюсь его регистрировать - модуль загружен , но точка входа DLLRegisterServer не найдена. Перепробовал: c:\Windows\SysWOW64\regsvr32.exe *.dll c:\Windows\System32\regsvr32.exe *.dll отключил UAC Компонент писал по книге InsideCOM Взял пример из книги Скрытый текст LIBRARY Cmpnt.dll DESCRIPTION 'Chapter 7 Example COM Component (c)1996-1997 Dale E. Rogerson' EXPORTS DllGetClassObject @2 PRIVATE DllCanUnloadNow @3 PRIVATE DllRegisterServer @4 PRIVATE DllUnregisterServer @5 PRIVATE В результате та же хрень ток боком!!!! Написал свой регистратор для этого примера - увидел, что я не могу загрузить DllRegisterServer С чем это связано? Подскажите пожалуйста |
Сообщ.
#2
,
|
|
|
Есть такой спецификатор __declspec(dllexport). Вероятно MS-компилятору нужен этот спецификатор, либо правильно указывать def-файл при сборке.
|
Сообщ.
#3
,
|
|
|
Цитата agapUP @ С чем это связано? Подскажите пожалуйста Проверял таблицу экспорта? |
Сообщ.
#4
,
|
|
|
Доброе время суток
... снес я vs2017 и установил 19-ю... код примера тот же! Но теперь, используя *.def я вижу "STDAPI DllRegisterServer()" и "STDAPI DllUnregisterServer()" DllGetClassObject и STDAPI DllCanUnloadNow() - некорректная аннотация и они игнорируются Цитата B.V. @ Проверял таблицу экспорта? Это выявил с помощью HMODULE lib = LoadLibraryEx("prCh7incom/Debug/prCh7incom.dll ", NULL, DONT_RESOLVE_DLL_REFERENCES); assert(((PIMAGE_DOS_HEADER)lib)->e_magic == IMAGE_DOS_SIGNATURE); PIMAGE_NT_HEADERS header = (PIMAGE_NT_HEADERS)((BYTE*)lib + ((PIMAGE_DOS_HEADER)lib)->e_lfanew); assert(header->Signature == IMAGE_NT_SIGNATURE); assert(header->OptionalHeader.NumberOfRvaAndSizes > 0); PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE*)lib + header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); assert(exports->AddressOfNames != 0); BYTE** names = (BYTE**)((int)lib + exports->AddressOfNames); for (int i = 0; i < exports->NumberOfNames; ++i) printf_s("Export: %s\n", (BYTE*)lib + (int)names[i]); Цитата grgdvo @ Есть такой спецификатор __declspec(dllexport)... Попробовал и это: Скрытый текст __declspec(dllexport) STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv): '__declspec(dllexport)': storage-class or type specifier(s) unexpected here; ignored prCh7incom\prsrver.cpp(256,23): warning C4502: 'linkage specification' requires use of keyword 'extern' and must precede all other specifiers EXTERN_C HRESULT __declspec(dllexport) __stdcall DllGetClassObject(): Error C2375 'DllGetClassObject': redefinition; different linkage prCh7incom Подскажите,пожалуйста, что я делаю не так |
Сообщ.
#5
,
|
|
|
А почему в .def
LIBRARY Cmpnt.dll а не LIBRARY prCh7incom.dll В принципе можно вообще убрать эту строчку. И не обязательно нумеровать функции если нет такой жесткой необходимости ; exports definition EXPORTS DllCanUnloadNow PRIVATE DllGetClassObject PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE Ну еще на всякий случай проверить что линкеру скармливается правильный .def |
Сообщ.
#6
,
|
|
|
Доброе время суток
sharky72, благодарю за совет |
Сообщ.
#7
,
|
|
|
Отлично , что ребята здесь всегда готовы помочь с решением проблемы.
|