我定义了一个导出函数:
extern "C" __declspec( dllexport ) int __stdcall GetTuxedoServerStatus()发现用DLL查看器查看的时候,导出的函数名是:_GetTuxedoServerStatus@0
这是为什么? 一般的导出函数名称不是就是函数名本身吗? 是不是我定义的有问题?另外,如果我想往这个函数里穿字符串,那么是否可以这样定义?
extern "C" __declspec( dllexport ) int __stdcall GetTuxedoServerStatus(char * pass, char * ReturnMsg);第一个参数用做传入,第二个参数用作返回字符串,这样使用是否正确?
PS:这时候得到的导出函数名是_GetTuxedoServerStatus@8这个函数我主要是用C++实现了调用tuxedo的功能,结果发现有严重的内存泄漏,代码如下,每次调用之后,都会内存泄漏.....可有人知道是什么原因?
似乎是最后的tpfree根本没有起到释放内存的效果....
extern "C" __declspec( dllexport ) int __stdcall GetTuxedoServerStatus()
{
FBFR32 *sendbuf, *rcvbuf;
long  rcvlen;
int ret,goon,index,srvId,numReq;
long ta_flags;
TPINIT *tpinitinfo;
// char * returnmsg = new char[2048];// returnmsg[0] = 0;
// ReturnStr[0] = 0;
tpinitinfo = (TPINIT *)tpalloc("TPINIT", NULL, 512);
    //tpinitinfo初始化
strcpy(tpinitinfo->usrname,"");
strcpy(tpinitinfo->cltname,"");
strcpy(tpinitinfo->passwd,"tuxedo");
tpinitinfo->flags = TPMULTICONTEXTS; if (tpinit(tpinitinfo) == -1) 
{
// tpfree(tpalloc);
        tpfree((char *)tpinitinfo);
return -1;
}
    
if((sendbuf =(FBFR32 *)tpalloc("FML32", NULL, MAX_LEN)) == NULL) 
{
tpterm();
        tpfree((char *)tpinitinfo);
return -2;
} if((rcvbuf =(FBFR32 *)tpalloc("FML32", NULL, 4096)) == NULL) 
{
tpfree((char *)sendbuf);
tpterm();
        tpfree((char *)tpinitinfo);
return -2;
}
tpfree((char *)sendbuf);
tpfree((char *)rcvbuf);
tpfree((char *)tpinitinfo);
tpterm();
//delete(returnmsg);
    return 0;
}

解决方案 »

  1.   

    用def文件指定你的导出函数名称GetTuxedoServerStatus,这样编译器不会给你修饰
      

  2.   

    在 *.def 文件中的 EXPORTS 下指定导出函数名。
      

  3.   


    定义了如下变量:FBFR32 *sendbuf, *rcvbuf;
        long  rcvlen;
        int ret,goon,index,srvId,numReq;
        long ta_flags;
        TPINIT *tpinitinfo;
    释放过程:    tpfree((char *)sendbuf);
        tpfree((char *)rcvbuf);
        tpfree((char *)tpinitinfo);
        tpterm();    
    我觉得已经算是释放完全的啊,难道是tpfree调用的有问题?
      

  4.   

    导出函数名是_GetTuxedoServerStatus@0是因为你指定了__stdcall,extern "C"与__stdcall组合后的函数名以_开头,末尾用@加数字表示函数参数的size。如果需要指定__stdcall,可以另加def文件来导出函数,文件中写:
    EXPORTS
        GetTuxedoServerStatus传递字符串通过char*参数。内存泄露的问题应该是出现在tp函数里面,可以跟踪看看。
      

  5.   

    要查看一下tpfree的调用是如何
      

  6.   

    名字改编而已,如果是在C++里调用你不用管他的,如果一定要去掉,用个def文件就可以了.
      

  7.   

    楼上都抢着说了, def 文件。内存释放不好说,说不定你申请了两次,只释放了一次。
      

  8.   

    你用的是C调用约定,也就是说导出的函数名并不一定和原函数名相同
    如果你在调用的时候也用同样的约定调用,这个导出的函数名没有影响
    VC++中默认的就是C调用约定当然如果你用标准调用约定,肯定要关注函数名的
      

  9.   

    谢谢大家,内存泄漏的话,应该是tuxedo自身的问题,短连接不断的初始化的话内存就会不断增加,我给改成长连接了。
      

  10.   


    整个dll里代码就这么点呢。