走一走,看一看,请高手帮忙,小弟跪求c++调用delphi的dll中函数传递字串参数问题。

9807146wang 2008-10-11 08:53:09
我要在c++中调用delphi编写的DLL中一个函数,而且要传递一字串参数,但不知为什么delphi中显示传过来的字串参数是乱码的,哪位高手遇到过,指点一下,多谢了。
c++代码如下:
typedef int (* pGetData)( char* P1) ;
pGetData GetData;
HINSTANCE hinst;
hinst=LoadLibrary(TEXT("DllTest.dll")); //加载该dll LPCTSTR strContent);
if(hinst==NULL)

{ MessageBox::Show("Can't load testll.dll");
return;
}
GetData=(pGetData)GetProcAddress(hinst,"TestDll"); //获取导出函数的地址

if(GetData==NULL)
{
MessageBox::Show("Can't get the address of the function");
return;
}
GetData("234"); //运行
FreeLibrary(hinst); //卸载


delphi代码如下:


function TestDll(P1:Pchar):integer; cdecl;

begin
ShowMessage(P1);
Result:=8888;
end;
exports TestDll;
begin
end.

...全文
142 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
9807146wang 2008-10-13
  • 打赏
  • 举报
回复
各位老大,我用VS2005,用窗体应用程序调用就会出现乱码,用控制台应用程序调用就不会出现乱码。
9807146wang 2008-10-13
  • 打赏
  • 举报
回复
to aca_jingru
我是用VS2005,我用的是vc++,我意思是在这个函数中显示传过来的参数会乱码,function TestDll(P1:Pchar):integer; cdecl;

begin
ShowMessage(P1);
Result:=8888;
有QQ吗?想合你交流一下,多谢了..
过去的我 2008-10-13
  • 打赏
  • 举报
回复
可能vs2005用unicode编码的,就像ls说的那样,因为vc6编译无问题的,
不过可以换种思路,把delphi 的dll改成 function TestDll(P1:Pwchar):integer; cdecl; 试试
代码无任何问题啊,
还有就是 MessageBox::Show 好像确实是。net里的东西吧。。
Big鹏 2008-10-13
  • 打赏
  • 举报
回复

楼主是不是要实现:在界面输入参数,然后调用DLL显示结果?
如果是这样,而且你说在控制台测试不会乱码,我还是建议你(delphi我不懂,不能指出代码问题,sorry):
1,编码问题(我估计应该是这个)。
2,内存分配问题,两种语言之间内存分配要匹配。
我遇到这个类似问题一个周才解决,呵呵
希望你能成功!!!
机智的呆呆 2008-10-11
  • 打赏
  • 举报
回复

typedef int (__stdcall * pGetData)( char* P1) ;

试试~~~~
9807146wang 2008-10-11
  • 打赏
  • 举报
回复
to hqin6
就是显示传过来的参数啊。。
返回一个整数值啊。
太乙 2008-10-11
  • 打赏
  • 举报
回复

delphi代码如下:


function TestDll(P1:Pchar):integer; cdecl;

begin
ShowMessage(P1);
Result:=8888;
end;
exports TestDll;
begin
end.



delphi不是太懂,解释一下啊?!

rollrock1987 2008-10-11
  • 打赏
  • 举报
回复
up
过去的我 2008-10-11
  • 打赏
  • 举报
回复
把 MessageBox::Show 改成printf就行了。。用的是c# ?
过去的我 2008-10-11
  • 打赏
  • 举报
回复
你确定你那段代码没错误?
代码正确的话不会出现乱码现象,我试过了,vc6
cdecl了以后不用加stdcall
9807146wang 2008-10-11
  • 打赏
  • 举报
回复
我现在delphi那边已经是这样的了。
function TestDll(P1:Pchar):integer; cdecl;
没有用stdcall,还要在c++那边用__stdcall吗??

TO mupengzhi
那我应该在delphi那边转吗?你的意思是我得把P1转化为ascii码吗?你那个是转化为什么类型啊??
jia_xiaoxin 2008-10-11
  • 打赏
  • 举报
回复
关于delphi和vc之间的dll调用,我知道的有两点需要注意

1.delphi中默认的调用规则是__stdcall,而vc中是_cdel,所以两边一定要一至。
你可以这样试试 typedef int (__stdcall * pGetData)( char* P1) ;

2.Delphi与VC的对齐格式不同,在VC中定义结构时要用以下格式:
#pragma pack(4)
//结构定义
#pragma pack()


Big鹏 2008-10-11
  • 打赏
  • 举报
回复

楼主,我没用过delphi,但用过c#,也同样碰到你这种情况;
就我的问题的解决给你答案,希望能对你有所帮助:
我的之所以产生乱码,是因为编码的问题,是C++和c#的编码不兼容。
c++默认是: ascii c#默认是: unicode。
至于delphi你查一下他的默认编码。
然后,你要将二者转化为一种编码,都是有相应的转化语句或是命令的。
我是把c#转化成ascii码的。只用了一个命令:CharSet = CharSet.Ansi。

星羽 2008-10-11
  • 打赏
  • 举报
回复
是不是数据类型的问题
Pchar是个什么东西,“234”能直接转Pchar吗

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧