各位老师好,我最近用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中如何传入字符
函数代码如下:
//==============================================================================
//获取网页代码 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中如何传入字符
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的约定写代码就行了