C
coolnerd
Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢各位的回复,特别是wr960204、wqyzsh。但问题似乎还是没有解决。索性我把问题再说的细一点,请大家给个完整的解答。
MSN:coolnerdXP[at]hotmail.com
Mail:guo.dehua[at]126.com
今日解决,酬劳100元,谢谢。
to wr960204: 如果你还能看到帖子,希望你能联系我,谢谢!
有一个C++(VC4)编译出来的DLL,现在需要用Delphi编写程序通过调用此Dll,获取一些数据。
我初步做了一下,但有些问题,调用一次,程序就会自己死掉了。
请熟悉Delphi调用Dll(C++做的)的朋友帮忙看一下。
//++++++++++++++++++++++++
// C++中的相关定义
//++++++++++++++++++++++++
//同名头文件:GetRealDataCall.h
//====================================================================
// 访问实时库所用数据结构
#pragma pack (push)
#pragma pack (1)
typedef struct tagRealData {
BYTE ID1;
BYTE ID2;
USHORT ID3;
union {
float YCValue;
int YXValue;
double DDValue;
char unuse[8];
};
} RealData, *PRealData;
#pragma pack (pop)
// 调用初始化
BOOL GetRDCallInit(char *szModuleName); // szModuleName 为模块名
// 调用退出
BOOL GetRDCallExit();
//获取数据
int GetRealData(int type, PRealData pRD, int num);
//======================================================================
函数GetRealData的作用是通过传入3个ID(ID1,ID2,ID3),将取到的结果放在上述的联合体中,具体到我的实际中,只会用到YCValue.
我在Delphi中是调用过程如下,但不能取到正确的结果.请帮我诊断一下,谢谢!
//++++++++++++++++++++++++++++++
// 目前Delphi中关于它的调用
//++++++++++++++++++++++++++++++
unit Unit1;
interface
uses
...;
type
TYCData = packed record
ID1 : Byte;
ID2 : Byte;
ID3 : Word;
case Integer of
0YCValue : Single);
1YXValue : Integer);
2DDValue : Real);
3unuse : array[0..7] of char);
end;
type
TFrmMain = class(TForm)
...
private
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
//目前这样申明的
function GetRealData(typeid:Integer;var pRD:TYCData;num:Integer):Integer
Stdcall
external 'GetRealDataCall.dll';
implementation
{$R *.dfm}
procedure TFrmMain.FormCreate(Sender: TObject);
begin
try
//向服务器进行注册模块
if not GetRDCallInit(pchar('FORECAST_00G')) then begin //这个是调用成功的。可以验证
showmessage('注册模块名【FORECAST_00G】失败');
end;
except
on E: Exception do begin
showmessage('注册模块名出错:'+E.Message);
end;
end;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
try
//注销模块名称
GetRDCallExit()
//这个是调用成功的。可以验证
except
//on E: Exception do
end;
end;
procedure TFrmMain.Button1Click(Sender: TObject);
var
thisID1,thisID2:Byte;
thisID3:Integer;
t_Data:TYCData;
returnInt:Integer;
begin
thisID1:=1;
thisID2:=1;
thisID3:=1;
FillChar(t_Data, Sizeof(t_Data), 0);
try
t_Data.ID1 :=thisID1;
t_Data.ID2 :=thisID1;
t_Data.ID3 :=thisID1;
returnInt:=GetRealData(0,t_Data,1)
//前后两个参数是常量,没有问题
showmessage(format('%f',[t_Data.YCValue]))
//为什么上述调用,有问题呢?
except
on E: Exception do
showmessage('调用出错:'+E.Message);
end;
end;
...
end.
MSN:coolnerdXP[at]hotmail.com
Mail:guo.dehua[at]126.com
今日解决,酬劳100元,谢谢。
to wr960204: 如果你还能看到帖子,希望你能联系我,谢谢!
有一个C++(VC4)编译出来的DLL,现在需要用Delphi编写程序通过调用此Dll,获取一些数据。
我初步做了一下,但有些问题,调用一次,程序就会自己死掉了。
请熟悉Delphi调用Dll(C++做的)的朋友帮忙看一下。
//++++++++++++++++++++++++
// C++中的相关定义
//++++++++++++++++++++++++
//同名头文件:GetRealDataCall.h
//====================================================================
// 访问实时库所用数据结构
#pragma pack (push)
#pragma pack (1)
typedef struct tagRealData {
BYTE ID1;
BYTE ID2;
USHORT ID3;
union {
float YCValue;
int YXValue;
double DDValue;
char unuse[8];
};
} RealData, *PRealData;
#pragma pack (pop)
// 调用初始化
BOOL GetRDCallInit(char *szModuleName); // szModuleName 为模块名
// 调用退出
BOOL GetRDCallExit();
//获取数据
int GetRealData(int type, PRealData pRD, int num);
//======================================================================
函数GetRealData的作用是通过传入3个ID(ID1,ID2,ID3),将取到的结果放在上述的联合体中,具体到我的实际中,只会用到YCValue.
我在Delphi中是调用过程如下,但不能取到正确的结果.请帮我诊断一下,谢谢!
//++++++++++++++++++++++++++++++
// 目前Delphi中关于它的调用
//++++++++++++++++++++++++++++++
unit Unit1;
interface
uses
...;
type
TYCData = packed record
ID1 : Byte;
ID2 : Byte;
ID3 : Word;
case Integer of
0YCValue : Single);
1YXValue : Integer);
2DDValue : Real);
3unuse : array[0..7] of char);
end;
type
TFrmMain = class(TForm)
...
private
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
//目前这样申明的
function GetRealData(typeid:Integer;var pRD:TYCData;num:Integer):Integer
Stdcall
external 'GetRealDataCall.dll';
implementation
{$R *.dfm}
procedure TFrmMain.FormCreate(Sender: TObject);
begin
try
//向服务器进行注册模块
if not GetRDCallInit(pchar('FORECAST_00G')) then begin //这个是调用成功的。可以验证
showmessage('注册模块名【FORECAST_00G】失败');
end;
except
on E: Exception do begin
showmessage('注册模块名出错:'+E.Message);
end;
end;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
try
//注销模块名称
GetRDCallExit()
//这个是调用成功的。可以验证
except
//on E: Exception do
end;
end;
procedure TFrmMain.Button1Click(Sender: TObject);
var
thisID1,thisID2:Byte;
thisID3:Integer;
t_Data:TYCData;
returnInt:Integer;
begin
thisID1:=1;
thisID2:=1;
thisID3:=1;
FillChar(t_Data, Sizeof(t_Data), 0);
try
t_Data.ID1 :=thisID1;
t_Data.ID2 :=thisID1;
t_Data.ID3 :=thisID1;
returnInt:=GetRealData(0,t_Data,1)
//前后两个参数是常量,没有问题
showmessage(format('%f',[t_Data.YCValue]))
//为什么上述调用,有问题呢?
except
on E: Exception do
showmessage('调用出错:'+E.Message);
end;
end;
...
end.