C++ PE格式文件导出函数

三种不同的解决办法(原理可能是一样的, :) ):

 

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 );

 

2 )在链接器参数中设置。例:

#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文件名:

/ 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

 

跟常规的动态链接库被映射到高地址处略有不同。

 

 

 还不知道是什么原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueliang2100

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值