锘??xml version="1.0" encoding="utf-8" standalone="yes"?> entryname 鏄瀵煎嚭鐨勫嚱鏁板悕鎴栧彉閲忓悕銆傝繖鏄繀閫夐」銆傚鏋滃鍑虹殑鍚嶇О涓?DLL 涓殑鍚嶇О涓嶅悓錛屽垯閫氳繃 internalname 鎸囧畾 DLL 涓鍑虹殑鍚嶇О銆備緥濡傦紝濡傛灉 DLL 瀵煎嚭鍑芥暟 func1()錛岃灝嗗畠鐢ㄤ綔 func2()錛屽垯搴旀寚瀹氾細 @ordinal 鍏佽鎸囧畾鏄簭鍙瘋屼笉鏄嚱鏁板悕灝嗚繘鍏?DLL 鐨勫鍑鴻〃銆傝繖鏈夊姪浜庢渶灝忓寲 DLL 鐨勫ぇ灝忋?LIB 鏂囦歡灝嗗寘鍚簭鍙蜂笌鍑芥暟涔嬮棿鐨勬槧灝勶紝榪欎嬌鎮ㄥ緱浠ュ儚閫氬父鍦ㄤ嬌鐢?DLL 鐨勯」鐩腑閭f牱浣跨敤鍑芥暟鍚嶃?/p>
鍙夌殑 NONAME 鍏抽敭瀛楀厑璁稿彧鎸夊簭鍙峰鍑猴紝騫跺噺灝忕粨鏋?DLL 涓鍑鴻〃鐨勫ぇ灝忋備絾鏄紝濡傛灉瑕佸湪 DLL 涓婁嬌鐢?GetProcAddress錛屽垯蹇呴』鐭ラ亾搴忓彿錛屽洜涓哄悕縐板皢鏃犳晥銆?/p>
鍙夌殑 PRIVATE 鍏抽敭瀛楃姝㈠皢 entryname 鏀懼埌鐢?LINK 鐢熸垚鐨勫鍏ュ簱涓傚畠瀵瑰悓鏍鋒槸鐢?LINK 鐢熸垚鐨勫浘鍍忎腑鐨勫鍑烘棤鏁堛?/p>
鍙夌殑 DATA 鍏抽敭瀛楁寚瀹氬鍑虹殑鏄暟鎹紝鑰屼笉鏄唬鐮併備緥濡傦紝鍙互瀵煎嚭鏁版嵁鍙橀噺錛?/p>
褰撳鍚屼竴瀵煎嚭浣跨敤 PRIVATE 鍜?DATA 鏃訛紝PRIVATE 蹇呴』浣嶄簬 DATA 鐨勫墠闈€?/p>
鏈変笁縐嶅鍑哄畾涔夌殑鏂規硶錛屾寜鐓у緩璁殑浣跨敤欏哄簭渚濇涓猴細 婧愪唬鐮佷腑鐨?__declspec(dllexport) 鍏抽敭瀛?/p>
.def 鏂囦歡涓殑 EXPORTS 璇彞 LINK 鍛戒護涓殑 /EXPORT 瑙勮寖 鎵鏈夎繖涓夌鏂規硶鍙互鐢ㄥ湪鍚屼竴涓▼搴忎腑銆侺INK 鍦ㄧ敓鎴愬寘鍚鍑虹殑紼嬪簭鏃惰繕鍒涘緩瀵煎叆搴擄紝闄ら潪鐢熸垚涓嬌鐢ㄤ簡 .exp 鏂囦歡銆?/p>
涓嬮潰鏄痙ef鏂囦歡 涓嬮潰鏄搴旂殑lib鐨勫鍑?br> 涓嬮潰鏄搴旂殑dll鏂囦歡鐨勫鍑?br> 浠庝笂闈㈠彲浠ョ湅鍑烘潵錛宒ef鏂囦歡鐨勭鍙峰湪lib涓殑浣滅敤騫朵笉澶э紝浣嗘槸鍑芥暟鍚嶇О錛屾瘮濡?span style="COLOR: #000000">?MinChange@@YAHHH@Z涓殑MinChange鏄洜涓篸ef涓?/a>鎶奙in鏀規垚浜哅inChange錛屾墍浠ib涓篃榪涜浜嗕慨鏀癸紝浣嗘槸榪欎釜MinChange絎﹀彿瀹為檯涓婂嚭鐜板湪dll鏂囦歡鐨刵ame鍒椾腑銆傚叾瀹炶繖涔熺湅鍑烘潵浜嗭紝def鏂囦歡鍙槸鍦╨oadlibrary榪欑榪愯鏃跺姞杞芥湁鏁堛?br>鐢變簬lib涓殑鍑芥暟鍚嶅彉鎴愪簡?MinChange@@YAHHH@Z錛屽鑷翠嬌鐢?strong>__declspec(dllimport)榪涜瀵煎叆鐨勫惎鍔ㄦ椂鍔犺澆錛岀敓鎴愮殑?Min@@YAHHH@Z鏃犳硶涓?span style="COLOR: #000000">?MinChange@@YAHHH@Z瀵瑰簲錛岃屽嚭鐜伴摼鎺ユ椂鐨勯敊璇傛墍浠ヤ笉搴旇鏀瑰彉鍑芥暟鍚嶏紝鑰屽簲璇ュ湪def鏂囦歡涓洿鎺ヤ嬌鐢ㄥ嚱鏁板悕錛岃繖鏍峰惎鍔ㄦ椂鍔犺澆鍜岃繍琛屾椂鍔犺澆閮借兘澶熼『鍒╄繘琛屻?br>鍚屾椂浠庝笂闈篃鍙互鐪嬪嚭NONAME鍜孭RIVATE鐨勪綔鐢ㄧ殑銆?br>闂錛氳瘯楠屼腑浣跨敤DATA鎬繪槸鍑洪敊錛屼笉鐭ラ亾鎬庝箞寮勩?br>
瀵逛笂闈㈣娉曠殑瑙i噴錛?br>1銆?br>
EXPORTS
func2=func1
2銆?br>
EXPORTS
i DATA
3銆?
4銆佷竴涓緇嗙殑
EXPORTS
DllCanUnloadNow @1 PRIVATE DATA
DllWindowName = Name DATA
DllGetClassObject @4 NONAME PRIVATE
DllRegisterServer @7
DllUnregisterServer
娉ㄦ剰錛屼嬌鐢?.def 鏂囦歡浠?DLL 涓鍑哄彉閲忔椂錛屼笉闇瑕佸湪鍙橀噺涓婃寚瀹?__declspec(dllexport)銆備絾鏄紝鍦ㄤ換浣曚嬌鐢?DLL 鐨勬枃浠朵腑錛屼粛蹇呴』鍦ㄦ暟鎹0鏄庝笂浣跨敤 __declspec(dllimport)銆?/pre>
涓嬮潰鐨勬槸涓涓緥瀛愶紝鍙互鐪嬪埌def鏂囦歡瀹為檯涓婄殑浣滅敤銆?br>
Node_t node;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)

{
node.x = 5;
node.y = 6;
return TRUE;
}

int Max(int x, int y)

{
if(x>=y)
return x;
else
return y;
}
int Min(int x, int y)

{
if(x>=y)
return y;
else
return x;
}
Node_t * func1()

{
return &node;
}
Node_t * func2()

{
return &node;
}
EXPORTS
Max =Max @2
MinChange =Min @1
func1 =func1 @3 NONAME
func2 =func2 @5 PRIVATE
node =node @8 PRIVATE
2 ?Max@@YAHHH@Z (int __cdecl Max(int,int))
1 ?MinChange@@YAHHH@Z (int __cdecl MinChange(int,int))
3 ?func1@@YAPAUNode_t@@XZ (struct Node_t * __cdecl func1(void))
ordinal hint RVA name
2 0 00001020 Max = ?Max@@YAHHH@Z (int __cdecl Max(int,int))
1 1 00001030 MinChange = ?Min@@YAHHH@Z (int __cdecl Min(int,int))
5 2 00001040 func2 = ?func1@@YAPAUNode_t@@XZ (struct Node_t * __cdecl func1(void))
8 3 00003348 node = ?node@@3UNode_t@@A (struct Node_t node)
3 00001040 [NONAME] ?func1@@YAPAUNode_t@@XZ (struct Node_t * __cdecl func1(void))
]]>
WORD wVersionRequested,
LPWSADATA lpWSAData
);
絎竴涓弬鏁版槸璋冪敤鑰呰兘澶熶嬌鐢ㄧ殑鏈楂樼増鏈彿銆?br>絎簩涓弬鏁頒腑鐨勫墠涓や釜鎴愬憳涓紝絎竴涓垚鍛樻槸sock dll榪斿洖鐨勭増鏈彿錛岀浜屼釜鍙傛暟鏄痙ll鏀寔鐨勬渶楂樼増鏈彿銆?br>
榪欎釜鍑芥暟鎴愬姛榪斿洖鐨勬潯浠舵槸錛岀涓涓弬鏁扮殑鐗堟湰鍙烽珮浜巗ock dll鑳藉鏀寔鐨勬渶浣庣増鏈紝閭d箞灝辮〃紺篸ll鑲畾鏀寔璋冪敤鑰呰兘澶熶嬌鐢ㄧ殑涓涓増鏈傚湪絎簩涓弬鏁頒腑鐨勭涓涓彉閲忕榪斿洖絎竴涓弬鏁板拰dll鏀寔鐨勬渶楂樼増鏈腑鐨勯偅涓皬鐨勭増鏈?br>紺轟緥鍥撅紝鏈夐噸鍙狅紝璇存槑瀛樺湪鍙互浣跨敤鐨勭増鏈?br>
絎竴琛屾槸璋冪敤鑰呰兘澶熶嬌鐢ㄧ殑鎵鏈夌増鏈紝絎簩琛屾槸dll鏀寔鐨勬墍鏈夌増鏈紝鑰岃繖涓嚱鏁頒腑鐨勭涓涓弬鏁版槸絎竴琛屼腑鐨勬渶澶х増鏈傜浜屼釜鍙傛暟涓殑絎竴涓垚鍛樻槸閲嶅彔閮ㄥ垎鐨勬渶澶х殑閭d釜銆傚鏋滄病鏈夐噸鍙犻儴鍒嗭紝閭d箞鍑芥暟澶辮觸銆?/strong>
]]>
RealseMutex
2.CreateThread涓殑涓寸晫鍖?
]]>
// TEMPLATE CLASS istream_iterator
template<class _Ty,
class _Elem = char,
class _Traits = char_traits<_Elem>,
class _Diff = ptrdiff_t>
class istream_iterator
: public iterator<input_iterator_tag, _Ty, _Diff,
const _Ty *, const _Ty&>
{ // wrap _Ty extracts from input stream as input iterator
typedef istream_iterator<_Ty, _Elem, _Traits, _Diff> _Myt;
public:
typedef _Elem char_type;
typedef _Traits traits_type;
typedef basic_istream<_Elem, _Traits> istream_type;
#if _SECURE_SCL
typedef _Range_checked_iterator_tag _Checked_iterator_category;
#endif
istream_iterator()
: _Myistr(0)
{ // construct singular iterator
}
istream_iterator(istream_type& _Istr)
: _Myistr(&_Istr)
{ // construct with input stream
_Getval();
}
const _Ty& operator*() const
{ // return designated value
#if _HAS_ITERATOR_DEBUGGING
if (_Myistr == 0)
{
_DEBUG_ERROR("istream_iterator is not dereferencable");
_SCL_SECURE_OUT_OF_RANGE;
}
#else
_SCL_SECURE_VALIDATE_RANGE(_Myistr != 0);
#endif /* _HAS_ITERATOR_DEBUGGING */
return (_Myval);
}
const _Ty *operator->() const
{ // return pointer to class object
return (&**this);
}
_Myt& operator++()
{ // preincrement
#if _HAS_ITERATOR_DEBUGGING
if (_Myistr == 0)
{
_DEBUG_ERROR("istream_iterator is not incrementable");
_SCL_SECURE_OUT_OF_RANGE;
}
#else
_SCL_SECURE_VALIDATE_RANGE(_Myistr != 0);
#endif /* _HAS_ITERATOR_DEBUGGING */
_Getval();
return (*this);
}
_Myt operator++(int)
{ // postincrement
_Myt _Tmp = *this;
++*this;
return (_Tmp);
}
bool _Equal(const _Myt& _Right) const
{ // test for iterator equality
return (_Myistr == _Right._Myistr);
}
protected:
void _Getval()
{ // get a _Ty value if possible
if (_Myistr != 0 && !(*_Myistr >> _Myval))
_Myistr = 0;
}
static void _Xran()
{ // report an out_of_range error
_THROW(out_of_range, "invalid istream_iterator");
}
istream_type *_Myistr; // pointer to input stream
_Ty _Myval; // lookahead value (valid if _Myistr is not null)
};
// istream_iterator TEMPLATE OPERATORS
template<class _Ty,
class _Elem,
class _Traits,
class _Diff> inline
bool operator==(
const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Left,
const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Right)
{ // test for istream_iterator equality
return (_Left._Equal(_Right));
}
template<class _Ty,
class _Elem,
class _Traits,
class _Diff> inline
bool operator!=(
const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Left,
const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Right)
{ // test for istream_iterator inequality
return (!(_Left == _Right));
}
綰㈣壊閮ㄥ垎灝辨槸閲嶇偣浜嗭紝鍏跺疄榪欑榪唬鍣ㄤ笉鑳借嚜澧烇紝鍙槸涓嶆柇鎶婃祦涓殑鍏冪礌鏀懼埌鑷繁鎵瀛樼殑鍊奸噷錛屽綋鍒拌揪嫻佹湯灝炬椂錛岀洿鎺ュ皢鍒ゆ柇鎸囬拡璁句負0銆?/p>
#include"windows.h"
#include"tchar.h"
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HANDLE g_hFile;
HANDLE g_hFile1;
struct sMsg

{
DWORD time;
DWORD message;
};

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE ,LPTSTR lpCmdLine,int nCmdShow)

{
if(!hInstance) return 0;
WNDCLASSEX wcex;
wcex.style = CS_HREDRAW | CS_OWNDC|CS_VREDRAW ; //甯哥敤璁劇疆,榪欎釜璁劇疆瀹氫箟綾誨湪閬囧埌鍚勭鎯呭喌鏃剁殑琛屼負,涓嶈繃閮芥槸浜涘彲鏈夊彲鏃犵殑涓滆タ
wcex.lpszClassName = TEXT("FIRSTCLASS"); //綾誨悕,蹇呴』瀛樺湪,榪欐槸寮曠敤綾葷殑宸笉澶氬敮涓鐨勬爣蹇?鍙︿竴涓槸class atom
wcex.hInstance = hInstance; //綾繪墍灞炵殑妯″潡鍙ユ焺,濡傛灉style涓湁CS_OWNDC,鐩稿弽,濡傛灉鏄疌S_CLASSDC鐨勮瘽,榪欎釜綾誨氨灞炰簬榪欎釜榪涚▼
wcex.lpszMenuName = NULL; //榪欐槸涓寚鍚戣彍鍗曡祫婧愮殑鎸囬拡,濡傛灉鏄疦ULL鐨勮瘽,鍒欐病鏈夎彍鍗?/span>
wcex.hCursor = LoadCursor(NULL,IDC_ARROW); //鍔犺澆榧犳爣鍥炬爣,濡傛灉鏄疦ULL鐨勮瘽,緋葷粺娌℃湁榛樿鐨勯紶鏍囧浘鏍?鍥犳鍥炬爣浼氬嚭鐜版湭瀹氫箟鎯呭喌
wcex.hIcon = NULL; //緋葷粺浼氬姞杞介粯璁ゅ浘鏍?/span>
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpfnWndProc = WindowProc;
wcex.cbClsExtra =0; //鍒嗛厤緇欑被鐨勯澶栧唴瀛?鏍規湰鐢ㄤ笉涓?璁句負0
wcex.cbWndExtra = 0; //鍒嗛厤緇欑敱榪欎釜綾諱駭鐢熺殑鎵鏈夌獥鍙g殑姣忎竴涓唴瀛樺ぇ灝?鐢ㄤ笉涓?0
wcex.cbSize = sizeof(WNDCLASSEX); //綾葷殑澶у皬,榪欎釜浼拌鏄互鍚庢墿灞曠殑鏃跺欑敤鐨勫惂,鎬誨叡涓ょ,闅鵑亾鏄敤鏉ュ尯鍒嗘櫘閫氱被鍜屾墿灞曠被???
wcex.hIconSm = NULL; //灝忓瀷鍥炬爣,NULL,緋葷粺鐭ラ亾濡備綍澶勭悊,褰卞搷涓嶄簡紼嬪簭鐨勬甯歌繍琛?/span>
if(!RegisterClassEx(&wcex)) //鍑芥暟澶辮觸,榪斿洖0,鍚﹀垯榪斿洖涓涓猘tom,榪欎釜atom鏄敤鏉ユ爣璁扮被鐨?浣嗘槸鐢ㄧ殑涓嶅,鑳界敤綾誨悕鐨勫湴鏂?涔熻兘鐢ㄨ繖涓滆タ
{
return 0;
}
g_hFile = CreateFile(L"d:\\pe\\messagefile.txt", // file to open
GENERIC_WRITE, // open for reading
FILE_SHARE_WRITE, // share for reading
NULL, // default security
OPEN_ALWAYS, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); 
g_hFile1 = CreateFile(L"messagefile1.txt",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//涓嬮潰鐨勮繖涓嚱鏁板拰CreateWindow鏄悓涓涓?鍙槸define浜嗗嚑涓弬鏁拌屼互,鎵浠ョ幇鍦ㄤ嬌鐢ㄧ殑CreateWindow灝辨槸CreateWindowEx
HWND hWnd = CreateWindowEx(0L,_T("FIRSTCLASS"),_T("name"),WS_OVERLAPPEDWINDOW ,CW_USEDEFAULT,CW_USEDEFAULT,640,480,NULL,NULL,hInstance,NULL);
if(!hWnd)
{
return 0;
}
ShowWindow(hWnd,nCmdShow );


MSG msg =
{0};
DWORD nbuffer;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);

sMsg smsg =
{0};
smsg.time = msg.time;
smsg.message = msg.message;
WriteFile( g_hFile1, &smsg, sizeof(smsg), &nbuffer, NULL );
DispatchMessage(&msg);
}
CloseHandle(g_hFile);
CloseHandle(g_hFile1);
return (int)msg.wParam;

}

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)

{
DWORD nbuffer;
WriteFile( g_hFile, &uMsg, sizeof(uMsg), &nbuffer, NULL ); 


PAINTSTRUCT ps;
HDC hdc;
switch(uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}