Вторую неделю мыкаюсь, пытаюсь скомпилировать 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"
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
void InitMyProcedure(HWND hwnd);
extern HWND hwndDll;
extern HWND hhook;
BOOL WINAPI _DllMainCRTStartup(HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
{
hmod = hModule;
switch (dwFunction)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
void WINAPI HookStart(HWND hwndMain)
{
[вырезано]
}
void WINAPI HookEnd(void)
{
[вырезано]
}
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
[вырезано]
return CallNextHookEx(hhook, nCode, wParam, lParam);
}
=== Конец Windows Clipboard ===
Что делаю: (VC6)
Попытка #1 (пробую экспортировать с помощью .def-файла)
File -> "New" -> "Win32 Dynamic-Link Library" -> "An empty DLL project" -> "OK"
Project -> "Add To Project" -> Files, добавляю все 9 .c, .h .def .rc .mak
Build -> "Rebuild All"
Ошибка:
=== Hачало Windows Clipboard ===
Linking...
Creating library Debug/tcdll.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), 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:
(символом ">" выделены строки вставленные мной)
=== Hачало Windows Clipboard ===
#include "stdafx.h"
#include "test.h"
#include "testDlg.h"
>#pragma comment(lib, "tcdll.lib")
>void WINAPI HookStart(HWND hwndMain);
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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 ===
Hу и изменения в реализациях этих функций:
#include "define.h"
MYDLL_API void WINAPI HookStart(HWND hwndMain)
MYDLL_API void WINAPI HookEnd(void)
MYDLL_API int WINAPI CopyToShareBuf(const char* src)
Компилирую... Ошибка:
=== Конец 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
COPT=/c /W3 /O2 /Foobj\ /DWIN32
LIBS=kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib
LINKOPT=/SUBSYSTEM:WINDOWS /DLL /OUT:TCDLL.dll /NODEFAULTLIB /DEF:tcdll.def
/IMPLIB:TCDLL.lib
TCDLL.dll: $(OBJS) obj\TCDLL.res
link $(LINKOPT) $(OBJS) $(LIBS) obj\TCDLL.res
obj\main.obj: main.c tcdll.h
cl $(COPT) main.c
obj\wndproc.obj: wndproc.c tcdll.h
cl $(COPT) wndproc.c
obj\format.obj: format.c tcdll.h
cl $(COPT) format.c
obj\startbtn.obj: startbtn.c tcdll.h
cl $(COPT) startbtn.c
obj\startmenu.obj: startmenu.c tcdll.h
cl $(COPT) startmenu.c
obj\taskswitch.obj: taskswitch.c tcdll.h
cl $(COPT) taskswitch.c
obj\font.obj: font.c tcdll.h
cl $(COPT) font.c
obj\bmp.obj: bmp.c
cl $(COPT) bmp.c
obj\utl.obj: utl.c
cl $(COPT) utl.c
obj\TCDLL.res: TCDLL.rc
rc /l 0x411 /fo obj\TCDLL.res TCDLL.rc
=== Конец Windows Clipboard ===
27.10.03 10:32: Перенесено модератором из 'C/C++' — ПК