VC6.0环境
Dll中程序如下:
dlltest.dll:
void aa(char** str)
{
    *str="eeeee";
}
调用程序如下:
test.exe:
void main()
{
    char *str="aaaa";
    HINSTANCE hTest=NULL;
    hTest=LoadLibrary("dlltest.dll");
    typedef int (*paa)(char** str);
    paa aa;
    aa=(paa)GetProcAddress(hTest,"aa");
    aa(&str);
    printf("%s\n",str);

cl通过,但执行时报”内存不能读“,但是两者在同一程序里(如下)则执行没问题:
test1.exe:
void aa(char** str)
{
    *str="eeeee";
}
void main()
{
    char *str="aaaa";
    aa(&str);
    printf("%s\n",str);

这时输出结果为:eeeee
另外,一个问题是:把Test1.exe改成如下:
test2.exe
void aa(char* str)
{
    str="eeeee";
}
void main()
{
    char *str="aaaa";
    aa(str);
    printf("%s\n",str);

这是输出结果为:aaaa,而不是eeeee,这里传的不是地址吗? 

解决方案 »

  1.   

    这不是DLL的问题,这是C++的问题,C++是值传递,指针作为参数传入的时候,该指针在函数体内会有一个副本,你在test2中,改变了指针参数str副本的地址,而非内容,所以参数str的内容是不会改变的。
      

  2.   

    请问goodboyws(深夜不眠者) :
        不好意思,我是个初学者,这种指针调用方式我试了很多次,都是内存不能读,我都没着了,请问您有通过参数从DLL中传回要修改的变量值的方法吗?请问skyruan(阿狼) :
        函数体里指针参数的副本与传进去的参数是同名吗?
        语句str="eeeee";应该只是付值吧,怎么把地址也改了呢?