zoukankan      html  css  js  c++  java
  • DLL函数写法 让我很受教育

    通常我会这样写:

    1. function Test(Str,RValue: PChar): Integer; stdcall;
    2. var S:String; 
    3. begin 
    4.   S:='This is Test'+Str;  
    5.   StrPCopy(RValue,S);
    6.   Result:= Length(S); 
    7. end

    今天看了CSDN上叫僵哥的一番话,很受教育,如下:

    1. function Test(Src: PChar;srcLen: Integer;Buffer: PChar;var Size: Integer): boolean; stdcall; 
    2. begin 
    3.   Result := false
    4.   //最好对指针类必须的参数做一个检查 
    5.   //Assert(Src <> Nil); 
    6.   //Buffer为NULL时,表示仅取数据大小填充Size 
    7.   //当Buffer不足时,通知Size告知实际需求的内容大小,并设置LastError为ERROR_MORE_DATA 
    8.   //注意:在通常情况下,只有处理过程完成才会知道实际所须的空间大小,而在此前是无法预知的 
    9.   //如果仅只传递一个大小回去,就要做完一遍,然后在取数据的时候还需要再做一遍,明显存在设计上的缺陷 
    10.   //最好的办法是考虑使用临时存储所需的信息,以在处理完一遍之后能够直接获取信息. 
    11.   //或者在调用环境支持回调的情况下,增加一个写出回调过程作为参数传进来 
    12.   if (Buffer = Nil) or (Size < srcLen) then begin 
    13.     SetLastError(Byte(Buffer <> Nil) * 234 (*ERROR_MORE_DATA, need more buffer size*) ); 
    14.     Size := srcLen; 
    15.     Exit; 
    16.   end
    17.   //正常处理 
    18.   Move(Src^, Buffer^, srcLen); 
    19.   Size := srcLen; 
    20.   Result := true
    21.   
    22. end

    不过还是有个疑问,Move方法出来的字符串最后多了一个@不知道为什么?慢慢消化吧

  • 相关阅读:
    oracle本地编译问题
    ORA-214 signalled during: ALTER DATABASE MOUNT 问题
    mysql常用的一些修改命令
    了解PHP中的Array数组和foreach
    在Sublime Text 3上安装代码格式化插件CodeFormatter
    自动在图片上添加页码
    Ubuntu 16.10 安装byzanz截取动态效果图工具
    PHP赋值运算
    Ubuntu 16.10 安装KolourPaint 4画图工具
    PHP数据类型之间的强制转换
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/9594826.html
Copyright © 2011-2022 走看看