各位老师好,我最近用DELPHI写了一个函数生成DLL,然后用程序调用
 函数代码如下:
//==============================================================================
//获取网页代码    GetWebPage   //这个破东西老出错,换了
//==============================================================================
  function   GetWebPage(const   Url:   string):string;stdcall;
  var   
      Session,   
      HttpFile:HINTERNET;
      szSizeBuffer:Pointer;
      dwLengthSizeBuffer:DWord;
      dwReserved:DWord;   
      dwFileSize:DWord;   
      dwBytesRead:DWord;   
      Contents:PChar;   
  begin      Session:=InternetOpen('',0,niL,niL,0);   
      HttpFile:=InternetOpenUrl(Session,PChar(Url),niL,0,0,0);   
      dwLengthSizeBuffer:=1024;   
      HttpQueryInfo(HttpFile,5,szSizeBuffer,dwLengthSizeBuffer,dwReserved);
      GetMem(Contents,dwFileSize);
      InternetReadFile(HttpFile,Contents,dwFileSize,dwBytesRead);
      InternetCloseHandle(HttpFile);
      InternetCloseHandle(Session);
      Result:=StrPas(Contents);
      FreeMem(Contents);
  end;   
exports
getwebpage;
end.我传入参数的时候出错,提示函数地址找不到,我在想是不是DLL写的函数,参数里面不能带STRING类型的,
或者是字符太长, 我看C的语法里面好像都是调用LPSTR 指针,我想请问下,这个函数如果要在DLL里面能正常好用的话,要怎么弄,如果是要传字符,请问DELPHI中如何传入字符

解决方案 »

  1.   

    不要传string,要用pchar,如果要返回字符串,不要返回pchar,而是把它当参数传入,并指定内存大小
    Delphi例子:function Test_GetXML(
        const XML : PChar;
        const XMLLen : Integer
        ):Integer;stdcall;
    var
      s : string;
      l : integer;
    begin
      s := '..........................';//获取值
      Result  :=  Length(s);  //值长度
      l := Result;
      if xmllen < l then l := xmllen; //处理分配长度不够的情况
      ZeroMemory(XML, XMLLen);
      CopyMemory(XML, @s[1], l);  //写入调用者分配的内存
    end;
    C#调用声明:  public class Dll_Test
      {
        private const string Dll_FileName = @"D:\Test.dll";
        [DllImport(Dll_FileName)]
        public static extern int Test_GetXML(
          StringBuilder XML,  //输出参数,XML文档内容,请分配足够的空间
          int XMLLen         //上面分配空间大小
          );  //返回XML文档大小
      }
    //C#调用:
          StringBuilder s = new StringBuilder(5000); 
          Dll_Test.Test_GetXML(
            s,
            s.Capacity
            );
          textbox.Text = s.ToString();
    内存管理原则:谁分配的空间谁释放
    你返回PChar的话,是DLL分配的内存,应该DLL释放,而调用者不知道DLL什么时候会释放,容易出错,特别在跨语言调用的情况下
    所以参考WINAPI的约定写代码就行了