Вторую неделю мыкаюсь, пытаюсь скомпилировать dll, нужно экспортировать оттуда
3 функции чтобы использовать их в MFC-приложении. Перепробовал все возможные
варианты, в инете перерыл немало сырцов с исходниками dll чтобы провести
параллель со своей dll чтобы выяснить где собака зарылась — ни в какую.
Поэтому прошу помощи у вас.
Есть dll в сырцах:
9 файлов *.c и по одному: .h .def .mak .rc (все писано на чистом WINAPI)
(в документации написано что компилировалось под VC5)
Содержимое .def:
=== Hачало Windows Clipboard ===
LIBRARY MYDLL
SECTIONS
.MYDATA SHARED READ WRITE
EXPORTS
HookStart
HookEnd
CopyToShareBuf
=== Конец Windows Clipboard ===
В .h продекларированы функции которые в остальных файлах .c, кроме тех что
экспортируются (HookStart, HookEnd, CopyToShareBuf)
Вот обрезанный "главный" .c :
=== Hачало Windows Clipboard ===
#include "mydll.h"
tcdll.dll — 2 error(s), 12 warning(s)
=== Конец Windows Clipboard ===
Пробую вставить "стандартный" DllMain:
=== Hачало Windows Clipboard ===
int WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
hmod = hInstance;
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}=== Конец Windows Clipboard ===
не помогло — та же ошибка.
Пробую вообще закомментировать _DllMainCRTStartup, вроде откомпилировась, сразу
пробую воспользоваться экспортируемой функцией HookStart из простого
MFC-приложения (Dialog Based)
New -> "MFC AppWinzard (exe)" -> "Dialog Based"
Копирую dll и lib в его каталог, пытаюсь воспользоваться функцией HookStart:
(символом ">" выделены строки вставленные мной)
// Add "About..." menu item to system menu.
>HookStart(this->GetSageHwnd());
.....................................
=== Конец Windows Clipboard ===
Запускаю... запустилось, но функция HookStart не сработала.
Видимо дело в закомментированной _DllMainCRTStartup.
Что делать — ума не приложу.
Попытка #2
Откатываюсь полностью назад:
"New" -> "Win32 Win32 Dynamic-Link Library"
"Project" -> "Add To Project" -> "Files"
"Build" -> "Rebuild All"
Знакомая до боли ошибка:
=== Конец Windows Clipboard ===
Linking...
Creating library Debug/mydll.lib and object Debug/tcdll.exp
LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/tcdll.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
tcdll.dll — 2 error(s), 0 warning(s)
=== Конец Windows Clipboard ===
Хочешь "main" — получи "main":
=== Конец Windows Clipboard ===
void main(void)
{
}
=== Конец Windows Clipboard ===
Откомпилировось, пробую воспользоваться функцией HookStart из MFC-приложения
(аналогично "попытке #1"): запустилось но функция HookStart снова не сработала.
(что касается main, DllMain, _DllMainCRTStartup, main и т.д. наверняка дело
в параметрах компилятора и линкера, но всевозможные эксперименты ни к чему
не привели)
Попытка #3 Пробую экспортировать функции без .def-файла, а с помощью
спецификации __declspec(dllexport/dllimport)
Снова:
"New" -> "Win32 Win32 Dynamic-Link Library"
"Project" -> "Add To Project" -> "Files"
"Build" -> "Rebuild All"
(на этот раз добавил все файлы кроме .def)
По привычке пытаюсь компилировать:
=== Конец Windows Clipboard ===
Linking...
LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/tcdll.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
tcdll.dll — 2 error(s), 12 warning(s)
=== Конец Windows Clipboard ===
Создаю новый define.h:
=== Конец Windows Clipboard ===
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
MYDLL_API void WINAPI HookStart(HWND hwndMain);
MYDLL_API void WINAPI HookEnd(void);
MYDLL_API int WINAPI CopyToShareBuf(const char* src);
=== Конец Windows Clipboard ===
=== Конец Windows Clipboard ===
Compiling...
main.c
c:\Dllsrc\main.c(50) : error C2491: 'HookStart' : definition of dllimport
function not allowed
c:\Dllsrc\main.c(73) : error C2491: 'HookEnd' : definition of dllimport
function not allowed
wndproc.c
c:\Dllsrc\wndproc.c(70) : error C2491: 'CopyToShareBuf' : definition of
dllimport function not allowed
Error executing cl.exe.
tcdll.dll — 3 error(s), 0 warning(s)
=== Конец Windows Clipboard ===
Бррр... уже ничо не понимаю, еще вчера на все это дело писались другие ошибки..
Также пробовал создавать "Win32 Dynamic-Link Library" -> "Exports some symbols"
и переделывать его (вставлял в созданный .cpp свой "главный" .c-файл с
добавлением
остальных .c и .h-файлов в проект)
Честно-слово, пробовал еще с дюжину вариантов — нифига.
Готов кинуть в e-mail/netmail "оригинальный" архив с сырцами этого dll
Очень надеюсь на вашу помощь...
Возможно дело в опциях компилятора/линкера, поэтому кидаю .mak-файл как есть:
=== Конец Windows Clipboard ===
OBJS=obj\main.obj obj\wndproc.obj obj\format.obj obj\startbtn.obj\
obj\startmenu.obj obj\taskswitch.obj obj\font.obj obj\bmp.obj obj\utl.obj