,VC调用VC写的动态库dll,大大们看看哪有有关问题

求助,VC调用VC写的动态库dll,大大们看看哪有问题
新建动态链接库NEWDLL
NEWDLL.h中: 
extern "C" _declspec(dllexport) string  transfer2Pin(string  input);
NEWDLL.cpp中:
#include <string>
using namespace std;
#include "NEWDLL.h"
string transfer2Pin(string input)//函数实现汉字转换拼音的功能
{
    string result;//返回值
    ...//过程略,VC中建工程直接调用此函数可以返回正确的result
    return result;
}
然后新建一个工程调用这个NEWDLL.dll
#include <iostream>
#include <string>
using namespace std;
#include <windows.h>
int main()
{   
string  a,b;
typedef string(* ptransfer2Pin)(string);
HINSTANCE hDLL=NULL;
ptransfer2Pin transfer2Pin;
hDLL=LoadLibrary("NEWDLL.dll");
    if(hDLL!=NULL)
{
    transfer2Pin=(ptransfer2Pin)GetProcAddress(hDLL,"transfer2Pin");
if(transfer2Pin!=NULL)
{
cout<<"请输入汉字:";
        cin>>a;
        b=transfer2Pin(a);
cout<<"转换结果是:"<<b<<endl;
}
            FreeLibrary(hDLL);
}
return 0;
}
程序运行能得到正确的结果,但随后弹出来:
调用NEWDLL.exe已停止工作 出现了一个问题,导致程序停止正常工作...
大大们看看哪里出现问题?

------解决方案--------------------
if(transfer2Pin!=NULL)
{
cout<<"请输入汉字:";
//        cin>>a; //屏蔽这句试试,直接赋一个固定汉字
a="工";
        b=transfer2Pin(a);
cout<<"转换结果是:"<<b<<endl;
}
没看出什么问题,直接赋一个汉字试试,有可能是主程序里的流程的问题,好象DLL还没处理完就注销DLL了
------解决方案--------------------
这是返回局部对象(string result;)造成的

return result;时会生成一个临时复制对象,result析构
而这个临时对象是在DLL构造,在EXE里析构的,会造成跨模块分配、释放内存的问题

DLL和EXE都改用CRT静态编译试试,可以看出问题
------解决方案--------------------
这个乱码是你在返回return result;
造成的.

string 很少用,我用的CString

在函数返回时 调用CString::AllocSysString,这样就会分配一个新的空间来保存返回值
------解决方案--------------------
是不是你的函数transfer2Pin()内部本身有问题,内存溢出之类的问题,所以释放的时候出问题了,你把这个函数屏蔽下,看看还是不是会出问题