如下是一个不能再简单的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
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
解决方案 »
- 为什么自己创建的基于CWnd类的子类,在classwizard里class name下面找不到呢?急求解决!!!
- 微软CListCtrl的败笔
- 请教,图象编码时的熵编码扫描方式问题!!
- 关于controlbar窗口拖动的问题的问题!
- 一个没有经过打包Setup的程序...注册表..dll
- 最小化按纽
- ★★★哪位大侠用过VC下调用tuxedo?请问为什么单步调试的时候tpcall会失败?
- 关于文档视图,一个对象中视图的获得问题
- 基于对话框程序,非对话框类如何获得对话框类控件的句柄
- vs2008增加成员变量
- 有办法让dll自己运行代码?而不是用函数调用的形式
- 让发指令的间隔180秒(这段时间要发前面的指令),不要Sleep,状态机
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!
extern "C" _declspec(dllexport) strecho(char *outstr);
应该是dllimport,笔误.
应该是abcdef 才对啊,怎么解决呢?
{
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';
}
用printf打印一下。
这个字符串肯定在常量存储区。无论是elf格式还是pe格式还是java还是net等。不是运气好。这里只是输出。所以足够了。
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");
}
我用此种方式写到我的代码里,dll build可以,但是调用时会报错。 我把程序改为
strecho(char **outstr,int outstr_bytes)
int iLen = _snprintf(*outstr,outstr_bytes-1,"%s",p);
*outstr[iLen] = '\0';是不是此种方法不能用指针的指针???
谢谢各位,我找到原因了,返回指针字符串必须先开辟内存空间
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 )还请专家继续传道授业!
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内存
另外,如果不用函数返回值(我的应用程序写死,没法调用函数返回值),如何达到将参数引出?也就是再加一个参数 resultstr,如何实现?