C PE格式檔案匯出函式

2021-08-26 09:24:27 字數 3987 閱讀 9158

三種不同的解決辦法(原理可能是一樣的, :) ):

1 )在匯出函式宣告之前加上__declspec ( dllexport ) 。例:

__declspec ( dllexport )  int  add ( int  a ,  int  b );

__declspec ( dllexport )  int  sub ( int  a ,  int  b );

__declspec ( dllexport )  int  mul ( int  a ,  int  b );

__declspec ( dllexport )  int  div ( int  a ,  int  b );

#pragma  comment ( linker ,  "/export:_add,@1,noname" )

#pragma  comment ( linker ,  "/export:_sub,@2,noname" )

#pragma  comment ( linker ,  "/export:_mul,@3,noname" )

#pragma  comment ( linker ,  "/export:_div,@4,noname" )

3 )新增乙個def檔案,例:

exports

add       @1 noname

sub       @2 noname

mul       @3 noname

div       @4 noname

/ def : callee . def

注意:在def檔案中不要有

library  [ library ][ base = address ]

這樣的語句。

相比較而言,後兩種方法可以設定更多的引數。

函式舉例:

extern  "c"

int  add ( int  a ,  int  b )

return  ( a  +  b );

int  sub ( int  a ,  int  b )

return  ( a  -  b );

int  mul ( int  a ,  int  b )

return  ( a  *  b );

int  div ( int  a ,  int  b )

if  ( b  ==  0 )

return  0 ;

else

return  ( a  /  b );

編譯時會自動生成相應的匯出庫(lib)檔案,供呼叫者使用。

呼叫方法和普通的動態鏈結庫呼叫一樣。

呼叫者必須能夠找到被呼叫者的位置,否則報錯,被呼叫者是否執行不影響。

呼叫**舉例:

extern  "c"

int  add ( int  a ,  int  b );

int  sub ( int  a ,  int  b );

int  mul ( int  a ,  int  b );

int  div ( int  a ,  int  b );

#pragma  comment  ( lib ,  "callee.lib" )

void  ccallerdlg :: onbnclickedcalculate ()

// todo: add your control notification handler code here

updatedata ( true );

switch  ((( ccombobox  *) getdlgitem ( idc_combo_operator ))-> getcursel ())

case  add :

m_iresult  =  add ( m_inum1 ,  m_inum2 );

break ;

case  sub :

m_iresult  =  sub ( m_inum1 ,  m_inum2 );

break ;

我在od中跟了一下,發現這跟呼叫動態鏈結庫也差不多。

003810f0  >  8b4424 08                  mov     eax ,  dword ptr  [ esp + 8 ]

003810f4    8b4c24 04                  mov     ecx ,  dword ptr  [ esp + 4 ]

003810f8    03c1                       add     eax ,  ecx

003810fa     c3                        retn

003810fb     cc                        int3

003810fc     cc                        int3

003810fd     cc                        int3

003810fe     cc                        int3

003810ff     cc                        int3

00381100  >  8b4424 04                  mov     eax ,  dword ptr  [ esp + 4 ]

00381104    2b4424 08                  sub     eax ,  dword ptr  [ esp + 8 ]

00381108     c3                        retn

00381109     cc                        int3

0038110a     cc                        int3

0038110b     cc                        int3

0038110c     cc                        int3

0038110d     cc                        int3

0038110e     cc                        int3

0038110f     cc                        int3

00381110  >  8b4424 04                  mov     eax ,  dword ptr  [ esp + 4 ]

00381114    0faf4424 08                imul    eax ,  dword ptr  [ esp + 8 ]

00381119     c3                        retn

0038111a     cc                        int3

0038111b     cc                        int3

0038111c     cc                        int3

0038111d     cc                        int3

0038111e     cc                        int3

0038111f     cc                        int3

00381120  >  8b4c24 08                  mov     ecx ,  dword ptr  [ esp + 8 ]

00381124    85c9                       test    ecx ,  ecx

00381126    75 03                      jnz      short  0038112b

00381128    33c0                       xor      eax ,  eax

0038112a     c3                        retn

還不知道是什麼原因。

texi格式檔案

ffmpeg自帶文件及示例程式,存放在doc目錄下,文件對ffmpeg各個模組都有說明。發現乙個問題,很文件擴充套件名為 texi,如ffplay.texi ffmpeg.texi等。用文字編輯器開啟,發現其中多了一些特殊的標記,在ubuntu乙個命令texi2html,可以將 texi檔案轉換成h...

texi格式檔案

ffmpeg自帶文件及示例程式,存放在doc目錄下,文件對ffmpeg各個模組都有說明。發現乙個問題,很文件擴充套件名為 texi,如ffplay.texi ffmpeg.texi等。用文字編輯器開啟,發現其中多了一些特殊的標記,在ubuntu乙個命令texi2html,可以將 texi檔案轉換成h...

tsv csv格式檔案

逗號分隔值 comma separated values,csv,有時也稱為字元分隔值,因為分隔字元也可以不是逗號 其檔案以純文字形式儲存 資料 數字和文字 純文字意味著該檔案是乙個字串行,不含必須像二進位制數字那樣被解讀的資料。csv檔案由任意數目的記錄組成,記錄間以某種換行符分隔 每條記錄由欄位...