char *dce_sTabName = (char *)malloc(strlen(sTabName.c_str())+1);
memset((void *)dce_sTabName,'\0',strlen(sTabName.c_str())+1);
strcpyDCE(dce_sTabName,(char *)sTabName.c_str(),30);

Why do you do a memset before the strcpy? Is freshly allocated memory "dirty" and needs "cleaning" before it can be used? The strcpy overwrites all allocated memory.

Why does strcpyDCE take a numeric parameter (30)? Does this do something significantly different from strncpy?

dce_sTabName = sTabName.c_str();

Why not just do dce_sTabName = sTabName; if dce_sTabName is a std::string? Strings are designed to work that way.