How to create .lib file when you have .dll and .h files onle (转)

How to create .lib file when you have .dll and .h files onle (转)[@more@]DOWNLOADs 3. Include the main article text That's all there is to it! All formatting will be done by our submission scripts and style sheets. --&gt CSS href="http://www.codeproject.com/styles/global.css">

Title: How to create .lib file when you have .dll and .h files onle. Author: Zhang Shenggang (China) EMail: bub_zhang@wistron.com.cn Environment: VC++ 6.0, win2000 (note: no testing on WIN9X and NT ) Keywords: dll, def, import library Level: Intermediate Description: An article on microsoft .lib file and .dll file Section Miscellaneous SubSection General

 
 
,

etc) --&gt

Problem

Have you encountered this situation:
you have xxx.dll and xxx.h file, but you havn't xxx.lib,
while you don't want to use LoadLibrary("xxx.dll"),
you want to implicitly link xxx.lib, then you can call
the functions in the xxx.dll smoothly. Also this article
illustrates some concepts about .DEF file eg. @ordinal[NONAME],
entryname[=internalname], [DATA], [PRIVATE].
This article is devoted to this tech. I wish it can help you
Now let's go:

Before we go, I will show something about .DEF
The syntax for an export definition is:
entryname[=internalname] [@ordinal[NONAME]] [DATA] [PRIVATE]
You can refer to my source code which illustrates how to use in .DEF file.

1. What is [PRIVATE]?

;xxx.def EXPORTS privatefun PRIVATE

It means that: 
 
privatefun is only put into xxx.dll, but the symbol(stub) not corresponding xxx.lib .
So, when you implicitly link your exe with xxx.lib, if you call privatefun();
you will get LNK2001 : unresolved external symbol "symbol"

2. What is entryname[=internalname] ?

;xxx.def EXPORTS LIBcdeclfun=cdeclfun

It means that: 
 
LIBcdeclfun is an alias of cdeclfun, note that Visual Basic can't accept '_'(undersocre), also, left name is more meaningful.

3. What is [DATA] ?

;xxx.def EXPORTS VCData DATA

It means that: 
 
vcdata is data, not function. You can use __declspec(dllimport)> to import it.

4. What is [@ordinal[NONAME]] ?

;xxx.def EXPORTS fun3 @333 NONAME

It means that: 
 
fun3 only exports with ordinal, not function name.
but you can in another yyy.def exports it with the same ordinal,
moreover, you can indicate a function name for this ordinal:

;xxx.def EXPORTS Minicfun3 @333

 
 

Note : You can use VC98Bindumpbin /exports xxx.lib
(dll, obj, etc.) show export section in PE file.

How to do it?

There are 3 projects in INIT workspace, "Demo", "MINIC", "VCDLL_VB" respectively.
"Demo.exe" depends on "MINIC.lib" and "VCDLL_VB.dll".

// a piece of VCDLL_VB.cpp extern "C" void cdeclfun() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString str; str.LoadString(IDS_STRING1); AfxMessageBox(str); } extern "C" void __stdcall fun() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); TCHAR chDLLName[MAX_PATH]; memset(chDLLName,0,sizeof(chDLLName)); GetModuleFileName(AfxGetInstanceHandle(),chDLLName,MAX_PATH); AfxMessageBox(chDLLName); } extern "C" int __stdcall fun2() { return 3; } extern "C" long __stdcall fun3(long a) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString str; str.LoadString(IDS_STRING2); return (long)AfxMessageBox(str); } extern "C" void __stdcall privatefun() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); AfxMessageBox(_T("call into VCDLL_VB!privatefun")); } int vcdata=12345; ----------------------------------------------------------------------- ; VCDLL_VB.def : Declares the module parameters for the DLL. LIBRARY "VCDLL_VB" DESCRIPTION 'VCDLL_vb windows Dynamic Link Library' EXPORTS fun fun2 fun3 @333 NONAME LIBcdeclfun=cdeclfun vcdata DATA privatefun PRIVATE

 
 

// a piece of MINIC.cpp extern "C" void LIBcdeclfun() { } extern "C" void __stdcall fun() { } extern "C" int __stdcall fun2() { return 3; } extern "C" long __stdcall Minicfun3(long a) { return a; } extern "C" void __stdcall Minic(int b) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); AfxMessageBox(_T("CString in MINIC")); } int vcdata=6789; --------------------------------------------------------------------- ; MINIC.def : Declares the module parameters for the DLL. LIBRARY "VCDLL_VB" DESCRIPTION 'MINIC Windows Dynamic Link Library' EXPORTS ; Explicit exports can go here fun fun2 Minicfun3 @333 vcdata DATA LIBcdeclfun Minic

 
 

Others important

If the dll export its functions by ordinal, still you can ...

Simply you set a new name for the ordinal

; VCDLL_VB.def EXPORTS fun3 @333 NONAME

 
 

corresponding

; MINIC.def EXPORTS Minicfun3 @333

 
 

In addition, you can export your function.
The compiler and linker don't claim,
but the Operating System's loader will claim

; MINIC.def EXPORTS Minic ;This function isn't existing in original .dll

 
 

when you run Demo.exe, you will get an error dialog below.
Sorry, I'm using Windows 2000 for P.R.C. Simplified Chinese

Sample Image

Some tips

As you known, MFCxxx.dll exports its functions by ordinal,
which can save much space. There is an article in MSDN about
Q131313 HOWTO: Create 32-bit Import Libraries Without .OBjs or Source

About author

Hello, I'm Zhang Shenggang, a master of Mathematics(about PDE).
I'm graduated from Fudan University, Shanghai, China. Currently,
I'm working for Wistron (Shanghai) InfoComm (original Acer, a company in Taiwan).
If you have some problems, please contact with me

email: bub_zhang@wistron.com.cn

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-992791/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-992791/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值