не удается скомпилировать dll
От: Stanislav_K  
Дата: 26.10.03 20:31
Оценка:
Вторую неделю мыкаюсь, пытаюсь скомпилировать 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 ===
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.