Create a dll by hand

i have search for many time about this aspect,but there is little about it,not let us share my work about do it.
the theory about dll is simple ,but to do it by hand it 's not so easy.
1 first,the file:
select.c
BOOL APIENTRY DllMain(HANDLE hInst, DWORD ul_reason_being_called, LPVOID lpReserved)
{
    return 1;
        UNREFERENCED_PARAMETER(hInst);
        UNREFERENCED_PARAMETER(ul_reason_being_called);
        UNREFERENCED_PARAMETER(lpReserved);
}

void msg(){
MessageBox(NULL,"OK","ok",MB_OK);
}
2:must give def file to get lib and then can create dll.
select.def
LIBRARY   Select

EXPORTS
        msg                 @2


3:compile,if you use cl directly ,error:
C:/DLL>cl select.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

select.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:select.exe
select.obj
LINK : fatal error LNK1561: entry point must be defined
4:must use some option:
C:/DLL>cl -c -W3 -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -D_X86_=1 -D_WINNT -D
_WIN32_WINNT=0x0400 -D_WIN32_IE=0x0300 -DWINVER=0x0400 -DWIN32  -D_WIN32 -D_MT -
D_DLL -MD -Z7 -Od select.c
then will create some file:
5:then must create lib use lib:
C:/DLL>lib -machine:i386      -def:select.def      select.obj        -out:select
.lib
Microsoft (R) Library Manager Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

   Creating library select.lib and object select.exp

6:now can link and create dll.
C:/DLL>link -debug:full -debugtype:cv /NODEFAULTLIB /INCREMENTAL:NO /PDB:NONE /R
ELEASE /NOLOGO -entry:_DllMainCRTStartup@12 -dll      -base:0x1C000000   -out:se
lect.dll    select.exp select.obj msvcrt.lib oldnames.lib kernel32.lib  ws2_32.l
ib mswsock.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
7:now get select.dll file,can use it in c file,file is:
#include "windows.h"
void callDll();
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
  callDll();
    ::MessageBox(NULL,"ssssss","ssssssssss",0);
 return 0;
}
int showInfo(){
::MessageBox(NULL,"info","info",0);
return 99;
}
void callDll(){
typedef void (WINAPI * func)();
 HINSTANCE hmod;
 hmod = ::LoadLibrary ("select.dll");
 if(hmod==NULL)
 {
  MessageBox(NULL,"Fail","Fail",MB_OK);
 }
 func lpproc;
 lpproc = (func)GetProcAddress (hmod,"msg");
 if(lpproc!=(func)NULL)
  (*lpproc)();
  else{
  MessageBox(NULL,"can not find func","can not find func",MB_OK);
  }
 
 FreeLibrary(hmod);
}


8:compile it and run:
cl useDll.cpp user32.lib
9:OK!
addition:
so to use a dll is not very easy by hand.please enjoy it.!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值