我在我的动态库和主程序中都定义了一个指针
  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;

解决方案 »

  1.   

    TProviderInfo = Class(TManageDataSev)
      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;
      

  2.   

    可以使用内存共享,LPVOID MapViewOfFile(HANDLE hFileMappingObject, //  映象文件句柄 
    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));你可以试一下!
      

  3.   

    recdata := MapViewOfFile(hTest,FILE_MAP_WRITE,0,0,SizeOf(INATE_DATA));
      

  4.   

    To:FOX7899(bk) 
       谢谢你的关注,他们应该有区别,如果是普通的变量参数的话就没有必要发这张帖子了,这里传递的是指针结构体。
      

  5.   

    我想通过我定义的结构体把我的数据从动态库传递到主程序中!??
    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内部进行指针的转换
      

  6.   

    各位大哥,谁能出出主意?我现在别的问题都解决了就是如何在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; 
           }  
      

  7.   

    以下是动态库的程序
    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.
      

  8.   

    我想你是要在动态库中用xml吧。主要问题问题是坚决如何在动态库中用IXMLDocument来完成:
        Root := L1XMLDoc.DocumentElement;
        Parent_Node := Root.ChildNodes.First;
    我也遇到类似的问题,动态库中部能用IXMLDocument。
    关注!!!
      

  9.   

    jane 程序里面报的异常信息是什么呢?
      

  10.   

    我已经解决了,给个mail我给你发过来。function  xmlret(var m_File:Pchar): pchar;stdcall
    不要用pchar,用string可以,在工程中加入sharemem应该可以详细代码mail中告诉你
      

  11.   

    我的mail:
           [email protected]