我在我的动态库和主程序中都定义了一个指针
recdata=^INATE_DATA;
INATE_DATA=record
Long:integer;
SuccessFlag:boolean;
mydata:pchar;
end;我想通过我定义的结构体把我的数据从动态库传递到主程序中!不管何中方式解决就放分!!(小妹驽钝,有源码更佳)
var
xmlhead: string;
ServerIp: string;
Port: integer;
ClientId: string;
Password: string;procedure L1xmlhead();
function xmlret(var m_File:Pchar): pchar;stdcall;implementationprocedure L1xmlhead();
begin
xmlhead := 'POST http://' + ServerIp + ':' + inttostr(Port) + '/a.lif HTTP/1.1' ;
xmlhead := xmlhead + 'Host:' + L1ServerIp + ':' + inttostr(L1Port) ;
xmlhead := xmlhead + 'Content-Length:' + '956';
end;function xmlret(var m_File:Pchar): pchar;stdcall;
var
L1XMLDoc: IXMLDocument;
filestr: pchar;
Root: IXMLNode; //指向XML根结点
Parent_Node: IXMLNode; //指向定位节点
Child_node: IXMLNode; //指向定位节点子结点
grandchild_Node: IXMLNODE; //指向
testpar:INATE_DATA; mydata:INATE_DATA;
begin
// recdata:=pointer(rFunc);
filestr := ExtractFilePath(paramstr(0)) + m_File;
CoInitialize(nil);
try
L1XMLDoc := TXMLDocument.Create(nil);
L1XMLDoc.XML.Clear;
L1XMLDoc.Active := True;
L1XMLDoc.LoadFromFile(filestr);
mydata.Long :=L1XMLDoc.XML.Count;
mydata.SuccessFlag :=true;
mydata.mydata :=pchar(L1XMLDoc.XML.Text); L1XMLDoc.Active := True;
finally
L1XMLDoc := nil;
CoUnInitialize;
end;
end;
recdata=^INATE_DATA;
INATE_DATA=record
Long:integer;
SuccessFlag:boolean;
mydata:pchar;
end;我想通过我定义的结构体把我的数据从动态库传递到主程序中!不管何中方式解决就放分!!(小妹驽钝,有源码更佳)
var
xmlhead: string;
ServerIp: string;
Port: integer;
ClientId: string;
Password: string;procedure L1xmlhead();
function xmlret(var m_File:Pchar): pchar;stdcall;implementationprocedure L1xmlhead();
begin
xmlhead := 'POST http://' + ServerIp + ':' + inttostr(Port) + '/a.lif HTTP/1.1' ;
xmlhead := xmlhead + 'Host:' + L1ServerIp + ':' + inttostr(L1Port) ;
xmlhead := xmlhead + 'Content-Length:' + '956';
end;function xmlret(var m_File:Pchar): pchar;stdcall;
var
L1XMLDoc: IXMLDocument;
filestr: pchar;
Root: IXMLNode; //指向XML根结点
Parent_Node: IXMLNode; //指向定位节点
Child_node: IXMLNode; //指向定位节点子结点
grandchild_Node: IXMLNODE; //指向
testpar:INATE_DATA; mydata:INATE_DATA;
begin
// recdata:=pointer(rFunc);
filestr := ExtractFilePath(paramstr(0)) + m_File;
CoInitialize(nil);
try
L1XMLDoc := TXMLDocument.Create(nil);
L1XMLDoc.XML.Clear;
L1XMLDoc.Active := True;
L1XMLDoc.LoadFromFile(filestr);
mydata.Long :=L1XMLDoc.XML.Count;
mydata.SuccessFlag :=true;
mydata.mydata :=pchar(L1XMLDoc.XML.Text); L1XMLDoc.Active := True;
finally
L1XMLDoc := nil;
CoUnInitialize;
end;
end;
private
// 数据表字段信息
FID: Integer;
FName: String;
FNetAddress: String;
FContactID: Integer;
FFinanceID: Integer;
FNote: String;
Fdelete: Boolean;
FOperator: String;
FInputTime: TDateTime; // 取数成员设置
FProviderCDS: TClientDataSet; // 取数记录集
procedure SaveToCDS;
function GetDataSet: TClientDataSet;
function GetChanged: Boolean; virtual;
public
procedure SaveToObj;
constructor Create;
destructor Destroy; override;
// 数据操作
procedure Edit; override;
procedure Del(ID: Integer); override;
procedure Add; override;
function ApplyUpdate: Boolean; //override;
function IDToName(AID: Integer): String;
function NameToID(AName: String): Integer;
// 表字段封装
property ID: Integer read FID write FID;
property Name: string read FName write FName;
property NetAddress: string read FNetAddress write FNetAddress;
property ContactID: Integer read FContactID write FContactID;
property FinanceID: Integer read FFinanceID write FFinanceID;
property Note: string read FNote write FNote;
property Delete: Boolean read FDelete write FDelete;
property Operator: string read FOperator write FOperator;
property InputTime: TdateTime read FInputTime write FInputTime; property DataSet: TClientDataSet read GetDataSet;
property Changed: Boolean Read GetChanged;
end;
DWORD dwDesiredAccess, // 访问方式
DWORD dwFileOffsetHigh, // 映象文件区域的底值
DWORD dwFileOffsetLow, // 映象文件区域的顶值
DWORD dwNumberOfBytesToMap // 映射字节数 );如下:
recdata=^INATE_DATA;
INATE_DATA=record
Long:integer;
SuccessFlag:boolean;
mydata:pchar;
end;
hTest := CreateFileMapping($FFFFFFFF,Nil,Page_ReadWrite,0,$FFFF,pChar('Buffer'));
recdata := MapViewOfFile(hObject,FILE_MAP_WRITE,0,0,SizeOf(INATE_DATA));你可以试一下!
谢谢你的关注,他们应该有区别,如果是普通的变量参数的话就没有必要发这张帖子了,这里传递的是指针结构体。
recdata=^INATE_DATA;
INATE_DATA=record
Long:integer;
SuccessFlag:boolean;
mydata:pchar;
end;
你声明一个接口函数 传入这个结构指针就可以了呀 不过要在外面<调用方>分配内存哦。
比如
INate_data ind;
ind.mydata := new(PChar);
DllFunc(@ind)...你的DLL 都是用DELPHI写的吗。。如果是用其他的 可能还需要在DLL中定义同样的结构体 以在DLL内部进行指针的转换
Root := L1XMLDoc.DocumentElement;
Parent_Node := Root.ChildNodes.First;
/////////////////////////////////////////////////////////
Root: IXMLNode;
Parent_Node: IXMLNode;
Child_node: IXMLNode;
grandchild_Node: IXMLNODE;
least_node: IXMLNODE;
XmlInData: string;
begin
result:='';
XmlInData := '';
filestr := ExtractFilePath(paramstr(0)) + '\protocol\LCTR.xml';
CoInitialize(nil);
try
L1XMLDoc := TXMLDocument.Create(nil);
L1XMLDoc.XML.Clear;
L1XMLDoc.Active := True;
L1XMLDoc.LoadFromFile(filestr);
////////////////////////////////////////////////////////////////////////
{提取xml数据}
////////////////////////////////////////////////////////////////////////
{ Root := L1XMLDoc.DocumentElement;
Parent_Node := Root.ChildNodes.First;
while (Parent_Node <> nil) do
begin
.....
end;
}
Function com_state_patrol():TReceive_info;Stdcall;//通讯状态侦测
Function com_state_patrol():TReceive_info;Stdcall;//通讯状态侦测
begin
result:=Receive_info;
Receive_info.com_state:=0;
end;
以下为公共单元
unit read_meter_interface;interface
uses
Windows,SysUtils;type
Tarraybool=array [0..7] of boolean;type
TReceive_info=record
com_state:shortint;//返回通讯状态
receive_err_code:Tarraybool;//错误扩充代码
Receivedata:pointer; //返回信息类型
end;
Function com_state_patrol():TReceive_info;Stdcall;//通讯状态侦测
implementation
Function Get_comm_para;external 'BG_comm.dll' index 7;//获得串口参数end.基的你调用dll的程序必须包含公共单元,而动态库程序不能包含最后的函数定义部分
以下是动态工程代码模板
library BG_Comm;{$DEFINE BG_Comm}
{$S-}
uses
SysUtils,
Classes,
Windows,
Read_meter in 'Read_meter.pas',
read_meter_interface in 'read_meter_interface.pas';{$R *.res}
Procedure DLLEntryPoint(dwReason:DWord);
begin
Case dwReason of
DLL_PROCESS_ATTACH:bg_comm_Build;
DLL_PROCESS_DETACH:bg_comm_destroy;
DLL_THREAD_ATTACH:bg_comm_Build;
DLL_THREAD_DETACH:bg_comm_destroy;
end;
end;exports
set_comm_para index 1, //设置参数
open_comm index 2, //打开串口
dial_connect index 3, //拨号连接
com_state_patrol index 4,//通讯状态侦测
Close_comm index 5, //关闭串口
hang_up index 6,//挂机
Get_comm_para index 7,//获得串口参数
send_instruct index 8;//发送指令
begin DllProc:=@DLLEntryPoint;
DLLEntryPoint(Dll_PROCESS_ATTACH);
end.
Root := L1XMLDoc.DocumentElement;
Parent_Node := Root.ChildNodes.First;
我也遇到类似的问题,动态库中部能用IXMLDocument。
关注!!!
不要用pchar,用string可以,在工程中加入sharemem应该可以详细代码mail中告诉你
[email protected]