新建动态链接库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已停止工作 出现了一个问题,导致程序停止正常工作...
大大们看看哪里出现问题?

解决方案 »

  1.   

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

  2.   

    为什么我喜欢静态链接在link里加入.LIB然后直接用函数啊
      

  3.   

    试了,还是一样,能运行出正确结果,但是完了还会弹出:
    调用NEWDLL.exe已停止工作。 出现了一个问题,导致程序停止正常工作...
      

  4.   

                FreeLibrary(hDLL);
    }
    while(1);//加这句试试,程序死循环不干别的事,如果还弹出提示,就再屏蔽FreeLibrary(hDLL);这句,如果屏蔽这句还弹出提示,就查DLL这个transfer2Pin函数吧
    return 0;
      

  5.   

    这是返回局部对象(string result;)造成的return result;时会生成一个临时复制对象,result析构
    而这个临时对象是在DLL构造,在EXE里析构的,会造成跨模块分配、释放内存的问题DLL和EXE都改用CRT静态编译试试,可以看出问题
      

  6.   


    直接把string transfer2Pin(string input)函数放在EXE里试试
      

  7.   

    这个乱码是你在返回return result;
    造成的.string 很少用,我用的CString在函数返回时 调用CString::AllocSysString,这样就会分配一个新的空间来保存返回值
      

  8.   

    是不是你的函数transfer2Pin()内部本身有问题,内存溢出之类的问题,所以释放的时候出问题了,你把这个函数屏蔽下,看看还是不是会出问题
      

  9.   

    把这个函数直接放在EXE里用完全没有问题,确实是return result的问题,但是我想调用这个DLL,这个地方应该怎么改呢
      

  10.   

    transfer2Pin(string input,string* output);