补充脱了很长时间的QQ

首先向大家抱歉,之前说好的更新QQ,结果很长时间了,都没见动静。

这一段时间打在好好学习,电脑碰的少了,自然就忘了更新……还望见谅。

废话少说,下面是在Arch Linux上面运行QQ的方法。

首先你要有一个Wine,安装好wine,下面是我的安装了的Wine组件

实际上只需要安装上面已安装的东西就行。

然后从官网下载轻聊版(貌似国际版更好,不推荐普通版,首先是太庞大,其次安装的时候也

容易出错。但是我没试过国际版……)。然后运行安装包进行安装即可。这时候,它会安装到你的

Wine设置的C盘目录(这个东西你可以打开Wine的设置来搞,最好在设置的时候把字体什么的也一

并设置好,字体推荐使用微软雅黑,从随便一个Win7以上的电脑拷一个就行)。

安装完毕之后,你就可以在安装目录中的Bin文件夹中找到QQ.exe,运行之即可。

然而,你会发现,你在登录页面,看不到你输入的账号,这个没什么关系,你只需要一个一个输进去就行,可以勾上自动登录之类的(省的下次再这样)。然后一切都和Windows一样了。

不过,我发现,我的聊天界面,是不显示聊天记录的……就像下面

聊天框

实际上我框里面是应该有消息的……不过点一下消息记录还是可以看到消息的,虽然有点麻烦,但是保密性好不是?

然后下面是一些其他的截图。

能显示弹窗

还有主界面

不过右下角的企鹅图标,要双击才能弹出原来的框……

 

忙了半个晚上+一个上午,终于写完了一个小游戏

忙了一整个晚上,终于搞定了一个弹幕游戏(不是视频)

语言C#,此处是下载地址。欢迎大家批评,玩起来的时候我的感觉是有点卡(这不是因为机子慢或者资源占用高,因为我把刷新率降低到10帧了,至于为什么做,我也不知道~)。

按左右箭头控制左右移动,空格键发射子弹,ESC退出

当然我还有安装包,想要的在评论里放邮箱(当然我觉的没人想要安装包……)

随后我会在ghithub上发布我的代码

|我是传送门——>>>>小游戏 |

【教程】关于C#中调用Cpp编写的dll

dll文件
dll文件用的图片

前几天写了一篇文章,讲了如何建立dll以及如何调用dll,文章中使用的是C/C++,今天就说说怎么使用C#调用C++的dll。


首先建立一个C#工程。然后再原文件夹中的Debug文件夹中放入我们做好的dll,这里我们使用前一篇文章中建立的dll:“basic_dll.dll”,然后就是写代码。

在C#中如果要调用dll,就要using一个空间:System.Runtime.InteropServices,包含进来就好了。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

这里包含进了一些无关的东西,不用管它,我一建立工程就有这些了,懒得删-_-……

如果要载入dll,就要在声明方法之前加上


[DllImport("basic_dll.dll", EntryPoint = "add",CallingConvention = CallingConvention.Cdecl)]

其中,“basic_dll.dll”是我们要引入的dll的名字,要么它在程序的同一目录下,要么在系统中已经注册过,后面的“EntryPoint”是dll的入口函数,也就是我们要导入的函数名称,再后面的CallingConvention是调用约定,如果不加上这个调用约定的话,会导致编译时出现”对 PInvoke 函数“xxFunction()”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配“这样的错误,原因一会说。

然后的然后就是声明一下我们的函数了,在这里同样只有一个add(int, int)   -_-

一下是一段简单到要死的源代码


namespace Csharp调用
{

class Program
{
[DllImport("basic_dll.dll", EntryPoint = "add",CallingConvention = CallingConvention.Cdecl)]
public static extern int add(int a, int b);

static void Main(string[] args)
{
Console.WriteLine(add(3, 5));
Console.ReadKey();
}
}
}

这段代码极其简单以至于我就跳过解读了,然后说说关于刚才提到的堆栈不对称的问题。

众所周知,在c++WIN32程序中有三种calling convention(调用约定):__cdecl, __stdcall, __fastcall,默认为__cdecl。而c#中默认为CallingConvention =CallingConvention.Winapi,如果不对调用约定进行说明的话,会出现调用约定不一致的错误。当然,在dll中,要传出的方法应该放在extern ”C“中,不然会因为C++更改函数名而导致调用错误。