delphi 调用 vc 编写的dll问题急 ( 积分: 100 )

  • 主题发起人 主题发起人 zbsz515
  • 开始时间 开始时间
Z

zbsz515

Unregistered / Unconfirmed
GUEST, unregistred user!
vc 程序:
#include "stdafx.h"
#include "6dll.h"
extern "C"_declspec(dllexport) CString Getstr(void)
{
CString a;
a="556565656";
return(a);
}
delphi 声明
unit Unit2;
interface
function Getstr():pchar;stdcall;
implementation
function Getstr;external '6.dll' name 'Getstr';
end.
调用:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Edit4: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Text:=getstr;
end;

end.
但回传的字符串并不正确,请教
 
vc 程序:
#include "stdafx.h"
#include "6dll.h"
extern "C"_declspec(dllexport) CString Getstr(void)
{
CString a;
a="556565656";
return(a);
}
delphi 声明
unit Unit2;
interface
function Getstr():pchar;stdcall;
implementation
function Getstr;external '6.dll' name 'Getstr';
end.
调用:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Edit4: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Text:=getstr;
end;

end.
但回传的字符串并不正确,请教
 
procedure TForm1.Button1Click(Sender: TObject);
var
s : Array[0..1024] : of Char;
begin
s := getstr;
memo1.Line.Add(StrPas(s));
end;
 
[Error] Unit1.pas(36): Incompatible types: 'Array' and 'PAnsiChar'
[Fatal Error] Project1.dpr(6): Could not compile used unit 'Unit1.pas'
 
procedure TForm1.Button1Click(Sender: TObject);
var
s : pChar;
begin
s := StrAlloc(1024);
s := getstr;
memo1.Line.Add(StrPas(s));
StrDispose(s);
end;
 
to xianguo
"invalid pointer operation"
 
且去掉最后一行的是防语句,得出的字符串仍错误
 
CString 是支持宽字符的,
在delphi
就该用
WideString
 
呵呵,大哥们,不管什么类型的,到了最后还是只能输出
Memo1
<
?
?
l
,
?
?
l
,
?
?
l
 
基本功不扎实.涉及的问题太多,
1.声明不合适,在不同语言之间共享类对象是一件很不好的事
2.不恰当使用局部变量,局部对象变量在return之后会被释放.因此如果要返回,那么就要使用指针.
3....
你需要补习一下,最好是文字书籍
 
对vc不熟悉
用PWideChar试试
 
to zjan521
你好,能不能举个样例。麻烦?急用。
 
{
CString a;
a=&quot;556565656&quot;;
return(a);
}
已经出了a的生存期
{
char * res = new char[256];
strcpy(res, &quot;aaa&quot;);
return res;
}
releasebuff(char * pbuf)
{
delete [] pbuf;
}
 
VC犯规:返回到你的delphi的内容不确定,当然不对啦.
 
哈 在写个COM+ 组件 就可以了 我 前几天做的是delphi .dll vc调用 后来就写的
COm组件
 
能不能指出错在那里啊,如何改正啊
 
我这样声明然后调用竟然能行了,郁闷
Function test():String;stdcall;
implementation
function test;external 'gpib.dll' name 'Getstr';
end.
 

Similar threads

后退
顶部