[付费视频]Delphi视频Android开发使用静态库(A)和动态库(SO)

关于本视频:
前阵子接到一个委托,解决Delphi开发Android程序中串口通信的问题,厂家那边提供了c文件,需要翻译成delphi可用,
翻译倒是比较简单。不过后来翻译读写ic卡单元的时候进行不下去了,delphi还提供的不太完整,而且底层提供的也有些bug,
然后就有了直接使用.a和.so文件的想法,后来花不少精力,查阅资料和调试,终于调通了。
特意录制本视频希望能为大家解决一些实际问题。顺便赚点零花钱。

视频录制过程间隔时间比较长,拼接起来的,观看过程中会有一些停顿现象。
还有普通话太烂,请大家一并见谅

视频分为两节

DelphiAndroidLesson-1
时长: 23:40
1.演示如果在Eclipse中编写,编译.a 文件,
2.演示不使用Eclipse,编译成.a文件
3.Delphi中如果使用.a文件。

DelphiAndroidLesson-2
时长: 33:00

1.演示不使用Eclipse,编译成.so文件。
2.常规使用so文件的异常情况。
3.怎么样正确使用so文件。
4.运行调试例子

视频购买连接
http://diocp.taobao.com

申请加入 QDAC 视频付费教程群 :201867767;

为了让作者多赚点零花钱,敬请大家不传播该视频。谢谢合作。

【价格】
以人民币计价:
个人用户:99元
企业用户:500元
【作者】
D10.天地弦 185511468
【视频长度】
DelphiAndroidLesson-1
时长: 23:40
DelphiAndroidLesson-2
时长: 33:00
【视频语言】
中文,普通话
【视频编码】
格式:H.264 MP4
分辨率:1280×768
【教程源码】
包含示例工程源码
【上架时间】
预计 2016 年 5 月 18 日 ~ 2016 年 5 月 22 日
【付款方式】
申请加入 QDAC 视频付费教程群 :201867767;
找到下面视频的价格,然后通过以下方式付费:
[淘宝]
访问淘宝店铺:diocp.taobao.com
[支付宝转账]
账号:ymofen@diocp.org 户名:杨茂丰 (请标明QQ号)
付费后,请用 QQ 给作者发送消息,作者会将视频的通过 QQ 离线发送给你。
请及时下载视频到您自己的网盘或本地,然后使用普通的视频播放器播放。
【版权提示】
视频版权归视频制作者所有,仅限你自己观看,请勿请视频公开发布到网络。一旦发现传播,就会取消您的后续购买资格,并不会退还已经支付的费用。

【内容目录】

注意:此目录为初步纲要,最终以实际完成视频内容为准。

本视频介绍Android开发中使用c的代码-方法一(静态库使用)
1. 编写一个简单的c文件。
2. 编写Android.mk文件。
3. 怎么样编译c文件成静态库文件。
4. 怎么样在delphi中使用编译好的静态库。
本视频介绍Android开发中使用c的代码-方法二(动态库使用)
1. 编写一个简单的c文件。
2. 编写Android.mk文件。
3. 怎么样编译c文件成动态库文件。
4. 怎么样在delphi中使用编译好的动态库。

【DIOCP-说明书】常见问题(FAQ)持续更新

1.diocp-v5使用在哪里可以得到帮助
http://www.diocp.org/?page_id=159
  可以浏览官方社区的一些基础说明,该文档会陆续进行整理。

 

2.diocp-v5怎么样编译DEMO 
  <<关于DEMO的编译>>
http://www.diocp.org/?p=16
2.1
Q:在编译DiocpV5DEMO是编译不通过
A:你编译DEMO的时候,把diocpv5\source加入到路径就好
  不要把所有Source下的文件添加到工程,因为有一些文件是给android/ios平台用的当然不能在windows下面编译,
  例如:diocp.core.rawPosixSocket.pas

 

3.服务端避免不了和多线程打交道,请先好好熟悉多线程的基础知识和注意实现。下面有多线程的一些文章,请认真看看。
http://blog.qdac.cc/?p=890

 

 

Q:服务端在线信息显示为何与实际有差异?
Q:服务端许多死链接都显示在线?
A:DIOCP默认关闭了心跳。所以会造成很多死链接,仍然显示在线,详细原因点击查看该文章:http://www.diocp.org/?p=189
(【DIOCP3-说明书】关于服务端的KeepAlive属性(心跳))

 

Q: 在Diocp中我需要另外开线程去处理逻辑吗?
A: 在编码层(TDiocpCoderTcpServer), 逻辑处理事件(OnContextAction), 是由DiocpTask/Qworker(编译开关(QDAC_QWorker)可以进行切换)驱动的,和底层的通信线程是不相干扰。所以在编码层不需要使用另外的线程池,来处理逻辑。

 

Q: 同一个连接的OnContextAction会同时被多个线程触发吗?
A:编码层的OnContextAction是排队处理的,底层接收到数据后交由注册的解码器进行解码, 解码成功后,放到任务队列,然后依次触发OnContextAction,所以同一个连接的OnContextAction同时只会有一个线程调用。

 

Q: Diocp的断开日志
A: Diocp在DEBUG模式下面会记录详细的日志。会记录每个连接断开的原因。如下
   1> xxxx:[2824]投递发送数据请求时出现了错误。错误代码:10054
     说明: 这种日志在发送数据的时候系统返回了错误代码,可以根据错误代码(如10054),查询到相应的错误信息。
   2> xxxx: [720]响应接收请求时出现了错误。错误代码:64!
     说明:这种日志在响应接收请求时系统返回的错误,根据错误代码查询响应的信息。
   3> xxxx: [704]接收到0字节的数据,该连接将断开!
     说明: 服务端接收到长度为0字节的数据,认为对方关闭了连接。服务端相应的会释放连接触发OnDiscconected函数。
   4> xxxx :[812]执行[CheckNextSendRequest::lvRequest.ExecuteSend]失败: 处理投递发送请求数据包时,发现异步关闭请求(Request.Tag = -1)。进行关闭处理!
     说明: 这种日志一般在服务端投递了异步关闭请求(PostWSAClose)时,会出现该日志。
   上面列举的日志都是正常的,DIOCP只是记录详细情况,以便出现问题时能有据可查,请勿惊慌。
   * 中括号[]中的数字是连接对应的SocketHandle,是连接的套接字句柄。

   MSDN上面错误代码说明:

      https://msdn.microsoft.com/en-us/library/ms740668.aspx 

      https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

 

Q: Diocp如何关闭日志记录。
A: Diocp在DEBUG模式会记录详细日志。可以把DEBUG模式关闭
   D2007工程为例: Project->Options->Directories/Conditionals->Conditional defines 中把DEBUG删除

DX10下面WSASocket阻塞的情况

今天帮群友调程序,说是程序会卡在WSASocket这一句。看CallStack

 

大概的流程是这样的

Application.Run –> LoadLibrary(A.dll, 带包bpl)->diocp.socket.utils( 初始化单元) –> loadIocpExFunction->WSASocket(阻塞了)

 

后来在主程序中引用diocp.socket.utils单元,使得初始化WSASocket提前到EXE中完成,一切正常

Eclipse(Ubuntu)中使用git插件

 

1.首先安装Git插件,可以Help –>Eclipse Maketplace搜索Git,进行更新或者安装。

2.安装后可以在Windows –> Show Views->Others… 把Git 仓库显示出来

image

3. 然后可以远程下载一个(Clone a Git respository)

image

Next后, 选择一个本地存放的位置,finish就好,如果第一次使用,会要求输入一个密码,自己设定一个,记住就好

image

后面那个找回密码的自己看着办就好了,反正是本地使用

4.然后可以把仓库中的项目导入到工作项目中 (我怎么觉得是导出来,进行使用。。。)

image

选择怎么操作,我们这里是把git上面的项目导出来使用, 选择的第一个

image

然后会出现仓库中的项目,选择一个进行操作

image

完成后可以看到项目出来了,可以开始写程序了。

image

导入现有项目到仓库中

image

image

然后可以提交了,如果没有设置信息,可以进行设置

image

提交你想要的文件后,就然后可以Push了

image

最后登陆oschina.net上面看到已经上传了

image

Eclipse中使用EGit插件就是这样的过程了。

上面过程在Ubuntu14.04LTS版本下面操作完成。

 

=========================================================================================

diocp|mybean官方网站: 主域名: www.diocp.org

diocp|mybean官方论坛: http://delphi.net.cn

【MyBean调试笔记】接口的使用和清理二(关于接口在MyBean中的应用注意)

【DEMO信息】

有问题的DEMO, 由【[北京]火鸟】提交

【问题描述】

程序关闭时出现AV错误

JEGJM3O3N445M38LK{JWTX0

【问题解答】

1:你有一个TDataMoudle的单实例插件,GetBean后他的Owner是vclOwners。在退出程序时清理了VclOwners后,然后清理单实例的接口为nil时出现了AV错误, 因为单实例要保留一份接口, 一般情况是不会出现av的
     这里mybean可以优化下,先清理单实例的接口, 但是也不能保证,如果插件在其他DLL时会出现的情况

2:第二个问题是主窗体上面声明了很多插件的实例接口, 如果不提前Free主窗体, 系统关闭主窗体的时候,Delphi会在清理对象的时候会自动清理接口:   接口:= nil, 这样我们都知道 会触发实例的release方法, 但是这个实例已经被释放了,而那块内存可能被破坏。所以主窗体先释放,避免提前清理接口

     (插件接口如果是由TComponent类已经他的子类实现, 可以在对象的Destroy时手动清理变量Pointer(AComponentIntf) := nil;  这样不会触发release方法。如果是接口管理生命周期的对象请不要这样做)

这也是我越来越讨厌Delphi自动编译add/release方法的原因了, 虽然component的release方法都基本没什么用, 但是如果这个实例对应的内存地址已经被破坏, 再去访问relase对应的那块地址时可能会参数AV

 

出现问题的原理就是我刚刚说的哪两种情况
归根到底还是接口赋值为nil的时候,触发了一块无效的对象空间的relase方法

 

 

【建议使用规范】

1. 窗体除非特殊的情况, 一般不要注册单实例,在关闭后,最好去释放窗体, 比如Action := caFree。

2. 主窗体提前释放,然后清理插件。推荐写法:

image

3. 单实例一般建议用由接口管理对象生命周期插件(继承TInterfacedObject)。而非TCompnent类级子类对象。

VS2013使用rtklib中需要注意的一些问题(编译)

最近因为项目需要需要对rtcm数据进行解码,rtklib提供了很多底层的函数,准备直接输出标准DLL的方式供C#调用。下面把项目中引用rtklib源码需要注意的地方记录下。

1. 首先在vs2013中新建一个win32的dll项目

2. 在项目上添加一个文件夹[rtklibsrc]然后在文件夹上【添加现有项目】把rtklib的源文件加入工程。在rtklibsrc下建立rcv把rcv下面的文件也添加到工程

  image

3. 现在开始编译工程,你会发现很多错误。下面我们一步步来解决错误。

   1>  Q: error C1853: “Debug\rtklibHelper.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)    x:\xxxx\rtklibhelper\rtklibsrc\tle.c    1    1    rtklibHelper
          A: 不使用预编译头image

         

  2> Q: 错误    1    error C4996: ‘strncpy’: This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    x:\xxxx\rtklibhelper\rtklibhelper\rtklibsrc\tle.c

        A: 其实提示上面已经告诉你方法了,需要你加入预编译指令来取消这个错误[_CRT_SECURE_NO_WARNINGS]

         image

 

3> Q:  error C4996: ‘gethostbyname’: Use getaddrinfo() or GetAddrInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings    x:\xxxx\rtklibhelper\rtklibsrc\stream.c

      A: 这个错误和上面类似,加入[_WINSOCK_DEPRECATED_NO_WARNINGS ]

 

4> Q:接下来是一个这样的错误  error C2466: 不能分配常量大小为 0 的数组    x:\xxxx\rtklibhelper\rtklibsrc\rinex.c

image

    A:这个错误我们来看一下, 在[MAXPRNGLO]上面按F12,看他的定义处

        image 这个常量为0,那么不能进行编译,我们想上面一样在预编译器里面加入 ENAGLO

 

5> Q:  error C1083: 无法打开包括文件: “rtklib.h”: No such file or directory    x:\xxxx\rtklibhelper\rtklibsrc\rcv\ublox.c    41    1    rtklibHelper

      A:  添加附加目录设置[.\rtklibsrc] image, 注意是C/C++的常规下面,不是链接器的常规页面。

 

6> Q:  error LNK2005: _input_oem3 已经在 novatel.obj 中定义    x:\xxxx\rtklibhelper\novatel_old.obj    rtklibHelper

      A: 这个错误是添加文件的时候添加重复了novatel_old.c不应该添加了,删除即可

          image 

 

  7>:  Q:  error LNK2019: 无法解析的外部符号 _settspan,该符号在函数 _postpos 中被引用    x:\xxxx\rtklibhelper\postpos.obj    rtklibHelper

                error LNK2019: 无法解析的外部符号 __imp__timeGetTime@0,该符号在函数 _tickget 中被引用   x:\xxxx\rtklibhelper\rtkcmn.obj    rtklibHelper

                error LNK2019: 无法解析的外部符号 __imp__accept@12,该符号在函数 _accept_nb 中被引用    x:\xxxx\rtklibhelper\stream.obj    rtklibHelper

        A: 添加附加库[连接器->输入->附加依赖库]添加winmm.lib, ws2_32.lib

         image

    

  8>:Q: error LNK2019: 无法解析的外部符号 _showmsg,该符号在函数 _convrnx 中被引用    x:\xxxx\rtklibhelper\convrnx.obj    rtklibHelper

        A: 一查showmsg这个函数如果在DLL中需要自己定义,rtklib里面已经做好了处理需要在预处理器里面加入[DLL]即可。

 

预处理器里面我们添加了

_CRT_SECURE_NO_WARNINGS
_WINSOCK_DEPRECATED_NO_WARNINGS
ENAGLO
DLL

 

  image

 

最后rtklibHelper编译成功了,可以开始编写具体的功能函数了。

 

 

=========================================================================================

diocp|mybean官方网站: 主域名: www.diocp.org

diocp|mybean官方论坛: http://delphi.net.cn

[MyBean-插件]MyBean通用报表免费无限制版本发布

 

【优点】

   1.开发时无需安装报表组件(可以直接用编译好的文件,注意版权说明,请自行编译一次相应的报表插件文件)。

   2.无带包烦恼所有版本Delphi都可以使用,不拖累Delphi版本的升级。

   3.可以实现单据的多种样式设计, 报表文件可以远程文件存储(网络共享)和本地文件存储。

   4.可以让每个用户设计自己的报表和设定自己的默认报表。

   5.支持多种报表组件(RM, FR, .. 可以扩展)

   6.调用简单,关联文件少。

 

【界面】

 

【关于版权】
  FastReport,RM的版权归原组件作者所有。请自行编译相关的报表插件,本DEMO中保留的FastReporter.dll,RMReporter.dll文件只能供学习使用,请不要用于商业用途。

【关于该插件
  该插件可以免费无限制使用,如果你觉得好用可以联系作者进行购买源码版本。也可以联系作者进行OEM。
  官方网站: www.diocp.org

 

【关于DEMO说明】
  ReporterDEMO.dpr包含三个文件
  Repoter-Common\MybeanReporterIntf.pas       MyBean报表插件的接口文件。
  Repoter-Common\MybeanReporterObjects.pas    MyBean报表插件的调用是需要使用到的一些基础类。
  Forms\ufrmPluginForm.pas                    演示窗体:如何调用使用插件直接预览,设计,打印。
 
  MyBeanSource                                是MyBean的源文件,编译DEMO需要用到MyBean核心文件,你可以设置工程的library路径,或者加入Delphi的Library Paths中
  编译出来的EXE请放置于BIN\文件夹中

【调用示例代码】
  // 报表对象
  FMyBeanReporter := TMyBeanReporter.Create();
  // 提供一个报表中使用的数据集
  FMyBeanReporter.ReporterDataProvider.AddDataSet(‘cdsMain’, self.cdsMain);

  // 报表归类ID(不同的ID可以有多个设计报表
  FMyBeanReporter.ReporterCatalogId := ‘1002579’; 
  // 当前用户,每个用户可以设置不同的默认报表
  FMyBeanReporter.UserName := cbbUser.Text;
  // 显示报表控制台(可以进行设计,管理报表)
  FMyBeanReporter.ShowConsole();   // DirectPreview(); 直接预览, // DirectPrint(); 直接打印

 

 

免费版下载地址

http://pan.baidu.com/s/1ntpBtBb

[C#-SQLite] SQLite一些奇怪的问题

今天整C#的DAO层,我用的2013, 用的4.0的.NetFramework刚刚创建完Helper就出现异常

+        Connection    “helper.Connection”引发了“System.IO.FileLoadException”类型的异常    System.Data.IDbConnection {System.IO.FileLoadException}

image

 

后来在搜索到一篇文章,在app.config中加入

<startup useLegacyV2RuntimeActivationPolicy=”true”>
<supportedRuntime version=”v4.0″/>
<requiredRuntime version=”v4.0.20506″ />
</startup>

http://blog.163.com/lemon_wangjun/blog/static/1197883802011312104054675/

 

加入后,倒是好了,但是很奇怪,有时候会出现下面这种异常

76H{`0$PJYTQSBQYSB2WFYG

 

后来翻了一下旧的项目设定,加入如下设定,暂时好了。

<startup useLegacyV2RuntimeActivationPolicy=”true”>
  <supportedRuntime version=”v4.0″ sku=”.NETFramework,Version=v4.0″/>
</startup>

[Delphi编译错误]F2084 Internal Error: U2107

看到这个错误真是头痛,这是一个很旧的项目了,想修改下东西,清理下工程一编译出现这个该死的错误,百度了下,也没解决问题。没办法只好编译所有的BPL了。

 

这个项目是带包编译的,而且带了几个自己的包。

点击这行错误时每次都出现在udmShare上面,想想应该是这个文件有问题,然后这个文件又是ShareCentre.bpl中的文件,shareCentre.bpl是被工程带包编译的,找到shareCentre.bpl重新编译,还是不行,后来折腾几下,一查找发现ShareCentre.bpl, dcp都是很早的,清理掉,重新编译,终于OK了。….