最近研究代理dll。但是导出名称遇到问题,原dll导出的函数结尾都带“@xx”,但是我编译的dll@会被去掉。
比如
_GetData@12=_MyFunc
应该导出“_GetData@12”才能用,但我只能导出“_GetData”。
试过加引号,但是没用。这个要怎么搞才行?

解决方案 »

  1.   

    def 文件, 每个函数后面有个用于指定 序号 的
    不知是不是那个
      

  2.   

    #ifdef __cplusplus
    extern "C"{
    #endif__declspec(dllexport) void __stdcall  test()
    {}#ifdef __cplusplus
    }
    #endif
      

  3.   

    这样是带@但是输出的不是制定的名称。
    比如_GetData@12=_MyFunc,我输出后是“_MyFunc@0”而不是“_GetData@12”
      

  4.   

    #ifdef __cplusplus
    extern "C"{
    #endif__declspec(dllexport) void __stdcall  test( int a, int b, int c )
    {}#ifdef __cplusplus
    }
    #endif
      

  5.   

    还是不行啊,难道不能直接输出指定的名称?我这个是代理dll很多函数都是空的。像这样:
    extern "C" __declspec(naked) void _MyFunc01()
    {
       __asm
    {
    jmp p[0*4];
    }
    }
      

  6.   

    看来问题还不少啊。。
    def文件 自定义导出名称
      

  7.   

    已经用def文件设置自定义名称了。_GetData@12=_MyFunc
    只是后面那个@xx老是被自动去掉。不知道编译器有没有设置能忽略@。
      

  8.   

    ??
    ......
    _GetData@12=_MyFunc@XX
      

  9.   

    _GetData@12 这个12似乎是表示函数参数有12个字节,给你的函数加个形参列表试试。
      

  10.   

    解决了,但是楼上方法都会出错,不能正常使用。要用下面的代码才行。
    extern "C" __declspec(naked) void _MyFunc01(int a,int b,int c) 

      __asm 

    pop ebp;
    jmp p[0*4]; 

    }
      

  11.   

    晕,那是我的例子__stdcall, 当然得用你的调用方式__cdecl 默认可以省略__cdecl
    恭喜一下.