[ECS使用技巧]使用阿里云服务器进行开发的小结
使用阿里云服务器开发总结(2周工作总结)
1、阿里云暂时只提供C#和Java的sdk,所以需要编写C++代码去调用Dll,以前学习过DLL的显式链接和隐式链接使用两种方式,在工作中加强了对DLL的灵活使用,DLL还分为32位和64位,因为DLL导出的函数指针有32位和64位之分。所以要编译32位和64位下不同版本的DLL来供客户来使用。
2、学习了用C#编写COM组件,网上教程不少,几点注意事项,
2.1 所要导出的类必须为公有
2.2 要导出的属性、方法必须使用接口方式,如果没有在接口中声明,即使 该方法为公有,也不能正常导出到COM中,导致外部调用出错。
2.3 要导出的类必须继承于接口,常识。
2.4 大家都知道COM是需要注册的。注册时要加密钥文件.SNK。进入VS2008 命令提示符。用命令:sn –k MyCom.snk 回车。在vs2008的命令行目 录里面就生成snk文件,将文件拷贝到自己工程目录下。
2.5 打开AssemblyInfo.cs 在里面加入[assembly:AssemblyKeyFile(“MyCom.snk”)]
2.6 修改项目属性 (1)项目属性->应用程序->程序集信息->选中“使程序 集COM可见”。(2)项目属性->生成->选中“为COM互操作注册”。
2.7 生成。如果在Debug下有一个MyCom.tlb,那你就成功了,如果没有生成,可以使用.Net FrameWork 下的RegAsm.exe这个工具来注册一下。
3、在C++中使用COM组件出现了不少问题。
3.1 使用Import将tlb导入到工程中
3.2 alioos_com::IMyOosInterfacePtr m_pAliOss;声明接口类型指针,使 用m_pAliOss.CreateInstance()函数对指针进行初始化,切记在此之前一定调用CoInitialize(NULL);来初始化COM组件,接下来判断 m_pAliOss是否为NULL,如果为空,接下来调用自然会失败。
3.3 正常调用COM组件中的自己编写的函数即可。
4、文件的上传下载,分块上传和分块下载以及获取文件大小函数的问题。
分块下载开始的时候,使用Stream的Read函数将文件数据从Stream读取到自定义数据缓冲区中。
分块上传的流程和思想:
1) Initiate Multipart Upload: 初始化一个Multipart Upload事件 客户端通知OSS要上传一个大文件,OSS返回给客户端一个唯一标识这次Multipart上传事件的Upload ID。
2) Upload Part:上传数据块
3) Complete Multipart Upload:完成一个Multipart Upload事件,在上传完所有的数据块到OSS上之后,我们就可以要求OSS在服务器端将指定的某个Upload ID所属的数据块组合成最终的文件。
在获取文件大小函数上出现了点问题,开始写的GetFileSize的代码没有什么问题,但是在循环调用2次以上的时候,获取文件大小的函数失败了,一直在找原因在哪里,错误可能发生在C++调用COM组件的时候,也可能是COM组件中获取文件大小的函数失败了,后来把COM组件相关函数代码注释只返回一个数值函数调用成功了,问题指出阿里云提供的api有问题,无语啊。开始的时候,根本就没怀疑过阿里的api会出现问题。质疑可能出现问题的原因,分析相关代码搞懂相关内容,然后去验证心里的想法。
文件读写类中的Read函数,使用安全数组m_pAliOss->Read(m_BucketName,m_Key,fileoffset,&psa,nNumberOfBytesToRead);
HRESULT SafeArrayResult = SafeArrayAccessData(psa, (void **)&pbuf);
memcpy(lpBuffer,(void*)pbuf,nNumberOfBytesToRead);
SafeArrayUnaccessData(psa);
在使用安全数组的时候,加强了指针和缓冲区的理解。SafeArrayAccessData这个函数是将缓冲区的指针返回给第二个参数,如果需要考虑安全数组中的数据,还需要使用memcpy函数将pbuf所指向的缓冲区中的数据拷贝到我们自己的缓冲区中。
在项目开发前期,会制定一个函数接口规范,先按照函数接口去实现函数功能,保持接口参数和返回值的统一性,后期有其他项目需求的时候,再对接口进行完善,对函数内部代码进行优化。
自己编写的代码自己要学会做单元测试,测试下功能模块是否实现了指定功能,不要想当然,自己动手测测就知道了。单元测试很重要。
5、在解决问题的过程中要大胆的质疑,认真的分析,在了解清楚每行代码的基础上,不放过可能有问题的代码。
6、以后写代码的时候要多加点错误处理和日志输出,方便以后有问题的时候进行调试排除错误。
7、最后在读取数据的时候还出现了点问题,首先我要读1M的数据,就一定要确认是否读取到了1M的数据,开始时我想当然以为读取到了1M的数据,其实只读取到了5000b左右而已,最后采用的循环读取流中制定长度的数据才解决。
(C++)CComBSTR ->wchar* ->(C#)String,当调用DLL时使用的是不同的语言,那么就涉及到不同语言数据类型之间的转换,这点需要注意下。
8、当文件下载成功以后,为了确保下载到的数据是否正确,将文件下载到本地与源文件进行比对,看看有什么不同的地方。从网络上读取的数据写入本地文件中,居然和源文件内容有差别,猜测如果前面有一个字符错位了,那么后面的字符都会错位导致错误。
在将音频或者视频数据写入文件中,最好使用二进制方式来进行写入。
如果有志同道合的朋友,欢迎一起交流技术,呵呵