如下是一个不能再简单的dll(返回一个固定字符串“abcdef”,然后用另一个程序调用此dll,达到赋值的效果。
dll用的是 传字符串 char* outstr,不知是哪里问题,就是无法调用。本人刚学vc,请大家务必帮忙看看。
//.h  ----dll .h
extern "C" _declspec(dllexport) strecho(char *outstr);
//CPP----dll cpp
 strecho(char *outstr)
{
     char *p="abcdef";
     outstr=p;
}//调用程序 cpp
extern "C" _declspec(dllexport) strecho(char *outstr);
#include "iostream.h"
#include "stdlib.h"
#include <cstring>
void main()
{
 char *resultstr;
 strecho(resultstr); //调用报错!!!
 cout<<"resultstr="<<resultstr<<endl;
 system("pause");
}执行此调用程序时,到dll处时会弹出错误窗口,提示如下错误:
unhandled exception in strecho.exe:0xC0000005:Access Violation

解决方案 »

  1.   

    //CPP----dll cpp
      strecho(char **outstr)
    {
       char *p="abcdef";
       *outstr=p;
    }//调用程序 cpp
    extern "C" _declspec(dllexport) strecho(char *outstr);
    #include "iostream.h"
    #include "stdlib.h"
    #include <cstring>
    void main()
    {
      char *resultstr;
      strecho(&resultstr); //调用报错!!!
      cout<<"resultstr="<<resultstr<<endl;
      system("pause");
    }test it please!
      

  2.   

    //调用程序 cpp
    extern "C" _declspec(dllexport) strecho(char *outstr);
    应该是dllimport,笔误. 
      

  3.   

    谢谢MDianng,不过结果只有第一个字母a 
    应该是abcdef 才对啊,怎么解决呢?
      

  4.   

    strecho(char **outstr)
    {
      char *p="abcdef";
      *outstr=p;
    }这种代码是危险的,不过你的运气还不错,因为="abcdef"在编译连接成了
    全局只读常量数据区了,所以你传出全局指针地址是没问题的,但是只能读
    不能写,否则会触发异常(0x00005),建议代码如下:strecho(char *outstr,int outstr_bytes)
    {
      char *p="abcdef";
      int iLen = _snprintf(outstr,outstr_bytes-1,"%s",p);
      outstr[iLen] = '\0';
    }
      

  5.   

    我这里木有问题啊。
    用printf打印一下。
      

  6.   


    这个字符串肯定在常量存储区。无论是elf格式还是pe格式还是java还是net等。不是运气好。这里只是输出。所以足够了。
      

  7.   

    用char** 方式的确可以得到正确输出 abcdef,不过我把同样的方法用到下面的函数就不行,下面函数将两个字符串连接并用一个新变量输出(我的应用软件要调用此dll 必须要有单独不同的输出变量);用vc调用dll发现在调用dll 步骤执行后,变量resultstr 的确变为正确的值了,但是一输出就没了(乱码)
    stradd(char* instr,char* addstr,char**resultstr)
    {
        char p[200];
        strcpy(p,instr);
        *resultstr=strcat(p,addstr);
        return 0;
    }
    //调用程序 cpp
    #include "iostream.h"
    #include "stdlib.h"
    #include <cstring>
    void main()
    {
     char*instr,*addstr,*resultstr;
     instr="abcd";
     addstr="123ertertgsdg";
     stradd(instr,addstr,&resultstr);//此步执行完后 查看变量resultstr是对的abcd123ertertgsdg
     cout<<"resultstr="<<resultstr<<endl;//此步执行完后 查看变量resultstr就变成乱码了?
     system("pause");
    }
      

  8.   


    我用此种方式写到我的代码里,dll build可以,但是调用时会报错。 我把程序改为
    strecho(char **outstr,int outstr_bytes)
    int iLen = _snprintf(*outstr,outstr_bytes-1,"%s",p);
       *outstr[iLen] = '\0';是不是此种方法不能用指针的指针???
      

  9.   


    谢谢各位,我找到原因了,返回指针字符串必须先开辟内存空间
     char* stradd(char* instr,char* addstr,char**resultstr)
    {
        char *p;
    p=(char*)malloc(sizeof(char)*200); //must allocate memory first!!!
    strcpy(p,instr);
        *resultstr=strcat(p,addstr);
        return *resultstr;
    }
    这样就可以了。  你们之前讨论的*p=“abcdef”,估计也就是此意思,固定在常量空间,所以不用再开辟。另外还有一个棘手问题,我的应用软件默认的输入参数是LPCSTR,或者LPSTR,只有这两项类型。我调用dll得到的 结果却是乱码, char 和 LPCSTR 需要转化吗?? 应用软件参数调用如下:
    void UTADLL stradd( LPCSTR instr, LPCSTR addstr, LPSTR resultstr )还请专家继续传道授业!
      

  10.   


    LPCSTR宏其实就是const char*
    LPSTR ==> char*void UTADLL stradd( LPCSTR instr, LPCSTR addstr, LPSTR* resultstr )比较合理的设计是
    LPSTR UTADLL stradd( LPCSTR instr, LPCSTR addstr) {
      char *p=(char*)malloc(sizeof(char)*(strlen(instr) + strlen(addstr) + 1));
      strcpy(p,instr);
      strcat(p,addstr);
      return p;
    }
    用完后记得必须要free内存
      

  11.   

    professor atjay:请教, 如何free 内存,在调用程序里释放? free(p)吗?
    另外,如果不用函数返回值(我的应用程序写死,没法调用函数返回值),如何达到将参数引出?也就是再加一个参数 resultstr,如何实现?