首页 > 代码库 > 阿里云服务器开发总结(2014-08-25)

阿里云服务器开发总结(2014-08-25)

阿里云服务器开发总结(这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、当文件下载成功以后,为了确保下载到的数据是否正确,将文件下载到本地与源文件进行比对,看看有什么不同的地方。从网络上读取的数据写入本地文件中,居然和源文件内容有差别,猜测如果前面有一个字符错位了,那么后面的字符都会错位导致错误。

在将音频或者视频数据写入文件中,最好使用二进制方式来进行写入。


代码在我的空间资源里,QQ:1078285863

如果有志同道合的朋友,欢迎一起交流技术,呵呵

 

 

阿里云服务器开发总结(2014-08-25)