存档

2015年5月 的存档

Gokit 上手试用

2015年5月12日 没有评论

在几个月前,在机智云官网上申请了他们的Gokit硬件,就在快要放弃掉的时候,他们人工审核联系了我,话说妹子的音色还不错,呵呵,话题扯远了。

经过电话的简单沟通,妹子说等消息吧。然后几天前,突然就收到了他们发的邮件,提供了邀请码,迅速兑换。然后昨天就拿到了真实的机器。

不知道大家有没有注意到,上面的图中,外面的透明盒子有一面是破了个洞。我开始还以为是快递在运输的过程中给损坏了,后来一琢磨,如果这里没有洞口的话,那么 USB 线是无法接进去的。后续如果对透明盒子那一面做好加工处理就更好了,目前的方式略暴力。

点击查看大图

开箱图

点击查看大图
Gokit 2代把板子分成2块,底部为功能块,有2种版本,我拿的是ST的版本,听说是要用C语言来开发,心里有点怵的慌。上面为扩展块,扩展块上集成有wifi组件,电机,此外有温度、湿度传感器,红外传感器,还有一个小灯,还兼容Arduino,很是不错喔。按照随机附送的说明书步骤说明,开机打开airlink的时候,诶哟喂,电机转的可欢了,我在办公室顿时吓呆了。不过后来我再开机的时候,电机到是没有运转。还不清楚具体的逻辑细节。

底部的螺丝固定位置设计的很好,可以防止安装位置反向,赞一个。

在出货时,里面就已经刷了微信宠物屋的固件了,按照说明书已经成功绑定了,可以在手机上远程控制,微信里也可以看到设备当前的温湿度。

后续有什么好玩的东西我再放上来吧,我需要把他和 yeelink 放一起评测下。等我的消息吧。

分类: 日常 标签: ,

c#代码创建快捷方式

2015年5月12日 没有评论

在前面的文章中,衣服自己洗分享了如何附加程序到任务栏。不过首先,你得有一个快捷方式,我们这里就来分享如何使用c#创建快捷方式。

C#里没有直接创建快捷方式的方法,衣服自己洗也在网上搜索了下,除了本文的代码外,还有利用WHO和vbs的方式,本文是使用直接代码com调用的方式,所谓萝卜白菜各有所爱,大家看着来吧。
代码比较长,总的来说,就是定义了2个结构体,一个类,一个接口,然后就是供外部调用的方法了。这里给出了关键的代码,剩余部分代码见下面的截图。

public static bool CreateShortcut(string shortcutPath, string targetPath, string workingDirectory, string description, string iconLocation = null)
{
const int SW_SHOWNORMAL = 1;
try
{
CShellLink cShellLink = new CShellLink();

IShellLink iShellLink = (IShellLink)cShellLink;
iShellLink.SetDescription(description);
iShellLink.SetShowCmd(SW_SHOWNORMAL);
iShellLink.SetPath(targetPath);
iShellLink.SetWorkingDirectory(workingDirectory);

if (!string.IsNullOrEmpty(iconLocation))
{
iShellLink.SetIconLocation(iconLocation, 0);
}

IPersistFile iPersistFile = (IPersistFile)iShellLink;
iPersistFile.Save(shortcutPath, false);

Marshal.ReleaseComObject(iPersistFile);
iPersistFile = null;
Marshal.ReleaseComObject(iShellLink);
iShellLink = null;
Marshal.ReleaseComObject(cShellLink);
cShellLink = null;

return true;
}
catch //(System.Exception ex)
{
return false;
}
}

shortcut

分类: 一句话 标签: , ,

c#获取可执行代码文件的数字签名信息

2015年5月12日 没有评论

在最近的场景中,有遇到过在运行某个程序前,先对程序进行数字签名验证。如果通过则运行,否则不运行。
数字签名技术广泛用在 exe、dll 等二进制可执行文件中,防止文件被篡改,保证了文件的唯一性。一旦文件被修改,则数字签名丢失。

C#中对获取数字签名基本信息是很简单的,微软已经帮我们封装好了,首先添加引用using System.Security.Cryptography.X509Certificates;
然后就是普通的调用:

X509Certificate cert = X509Certificate.CreateFromSignedFile(path);
var s = cert.Subject;
MessageBox.Show(s);

效果如下所示:

cert

certdlg

当然,这只是一个初步的校验,即校验是否存在数字签名。至于数字签名是否合法则需要进一步去做校验。另外,对于CreateFromSignedFile方法,如果文件没有数字签名,那么会引发异常,所以代码里应该添加对该异常的处理。

分类: 一句话 标签: , ,

win7/8/8.1中c#附加程序到任务栏

2015年5月12日 没有评论

远的不说,自从win7开始,当应用程序可以被附加到任务栏后,任务栏就成为各个应用抢占的入口,这里可以比开始菜单更快地启动程序。后来听说微软对OEM厂商有要求,预装软件不能随便pin到任务栏上,哈哈。

今天衣服自己洗就来分享如何附加程序到任务栏上。

大致的流程是先创建一个快捷方式,然后对该快捷方式执行附加命令。附加完成后,可以删除该快捷方式,任务栏图标还是存在的。对于取消是一样的步骤,无非就是步骤不一样而已。当附加成功后,会在用户的Roaming相关目录下自动生成快捷方式,系统会使用该快捷方式,而不是前面创建的快捷方式。

命令就是动作谓词,常见的谓词有run、open等操作,而附加和取消的谓词就是TaskbarPin/TaskbarUnPin,从实际经验来看,谓词是不区分大小写的。代码很简单,看看就明白了。
先申明操作的返回值枚举

public enum FileResult
{
Success,Failed,Exist,NotExist
}

附加到任务栏

public static FileResult PinToTaskBar(string linkPath, bool deleteLink = false)
{
if (!File.Exists(linkPath))
{
// 快捷方式不存在
return FileResult.Failed;
}

string name = System.IO.Path.GetFileName(linkPath);
string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, Environment.SpecialFolderOption.None)
+”\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\”;

if (File.Exists(userPath + name))
{
//当pin到任务栏后,该目录下会生成对应的快捷方式。
//通过判断该文件是否存在判断是否已经pin到任务栏
return FileResult.Exist;
}

ProcessStartInfo psi = new ProcessStartInfo(linkPath);

psi.Verb = “TaskbarPin”;
Process.Start(psi);

if (deleteLink)
{
//pin 完后删除快捷方式
File.Delete(linkPath);
}

return FileResult.Success;
}

取消附加到任务栏

public static FileResult UnPinToTaskBar(string linkPath, bool deleteLink = false)
{
if (!File.Exists(linkPath))
{
// 快捷方式不存在
return FileResult.Failed;
}

string name = System.IO.Path.GetFileName(linkPath);
string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, Environment.SpecialFolderOption.None)
+ “\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\”;

if (!File.Exists(userPath + name))
{
//当pin到任务栏后,该目录下会生成对应的快捷方式。
//通过判断该文件是否存在判断是否已经pin到任务栏
return FileResult.NotExist;
}

ProcessStartInfo psi = new ProcessStartInfo(linkPath);

psi.Verb = “TaskbarUnPin”;
Process.Start(psi);

if (deleteLink)
{
//pin 完后删除快捷方式
File.Delete(linkPath);
}

return FileResult.Success;
}

完整的代码如下图所示。

pin2TaskBar

 

在执行附加操作的时候,如果任务栏上已经附加了,执行谓词命令就会失败。同理,如果任务栏上没有,执行取消附加也会失败,所以就需要做一个判断,只在必要的时候来做判断。并根据不同的情况返回不同的枚举。

分类: 日常 标签: , ,

objective-c和swift相互调用

2015年5月5日 没有评论

自从苹果推出swift语言,已经过去好几个版本了,现在是时候考虑使用swift语言了。

在objective-c和swift相互调用的过程中,有一个很重要的文件,名称为<ProjectName>-Bridging-Header.h,假设我们的项目名称为 Laodaoxia,那么对应的文件名就是 Laodaoxia-Bridging-Header.h。这个文件第一次是由XCode自动生成的,这个文件负责完成2种不同的语言之间的转换。

现阶段,很多项目都是由objective-c创建的,当为他们添加新功能时,可以使用swift来编写。衣服自己洗先来说下如何添加swift支持。我们在项目中添加由swift文件,如果是第一次添加swift的话,IDE会提示你是否要创建桥接文件,点击是。此时,项目中会新增2个文件,一个是swift文件,一个是桥接文件。如果不小心删除了桥接文件,也可以手动创建一个,只要名称是符合上面的规定即可。

然后在swift文件中该怎么写代码就怎么写代码好了。对于 objective-c 文件,如果要调用swfit方法,则在对应的m文件里添加引用,#import “Laodaoxia-Swift.h”,剩下的就可以按照普通的 objective-c 的语法来调用swift 的方法了。<ProjectName>-Swift.h 文件应该是一个隐藏的文件,XCode负责把项目中的swift文件类通过该文件来提供给objective-c文件调用。

至于swift项目,要添加objective-c代码,例如很多通用库等等,也是差不多的步骤。项目中添加objective-c的类,第一次添加时,IDE会询问是否要添加桥接文件,同意添加后,项目中会新增对应的h文件,m文件和桥接文件。把swift会用到的objective-c类的头文件,全部使用#import假如到桥接文件里。

添加完成后,即可在swift代码里使用swift语法格式来使用objective-c提供的方法了。

分类: iOS 标签: , ,

c++和c#相互调用dll

2015年5月5日 评论已被关闭

前不久昊问起来如何让c++和c#相互调用dll,后来专门去搜索了下,现在衣服自己洗分享出来,可能对大家有帮助。
首先我们来说c#调用c++编译的dll。这个网上已经很多了,c++里和普通写法一样,设置导出函数等等,例如c++里有一个函数 int cplusplus(int a,int b),那么在C#里,可以先申明:

[DllImport (abc.dll)]
public extern static int cplusplus(int a,int b);

然后就可以像普通的C#函数一样调用了。有几个需要注意的地方,
1、DllImport 后括号里输入c++ 的dll 的文件名,如果该dll不是在系统目录或者环境变量的目录,或者是c#程序的bin目录里,这里就应该输入完整的路径。建议放到c#的bin目录里。
2、函数必须声明为public的,不要忘记了extern关键字,当然static也所必需的。
反过来,c++是如何调用c#的dll呢,例如c#里有一个函数 public int csharp(int a,int b)在类Pipe下,而Pipe类属于ABC命名空间,那么对于c++项目,首先应该设置项目属性,打开公共语言运行时支持,即/clr标记,然后c++项目中添加c#的dll文件引用,接下来,在cpp文件里添加c#对应函数的命名空间 using namespace ABC;最后就是在需要调用的地方,使用托管代码的方式调用:

Pipe ^p = gcnew Pipe();
int a = p.csharp(3,4);

网上有同学提及编译失败,有一种可能是没有添加dll的引用,如果不喜欢添加引用,那么在cpp 文件里,使用 #using “..\Debug\csharp.dll” 也是一样可以的,不过这里就是用using,而非 include关键字,当然绝对路径也是不可少的。

现在c++和c#相互调用dll的方式就算完成了,有的同学对c++调用c#的dll的方式不太认可。为什么呢,因为要用托管代码的方式。其实上面描述的方法,本质上是使用的COM调用来完成的,微软也给出了直接COM调用的示例,喜欢这种方式的同学不妨琢磨下。

分类: C++, 日常 标签: , ,