dll中的全局类实例什么时候初始化

如果外部工程ExeB调了动态库DllA中的函数,当ExeB运行时,DllA中的全局类实例一定会初始化,但不一定非得在ExeB中调DllA中的函数后DllA中的全局类实例才会初始化,比如在DllA中代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class DllA01()
{
public:
	DllA01()
	{
		MessageBoxA(NULL, "init", NULL, 0);
	}
	~DllA01()
	{
		MessageBoxA(NULL, "fini", NULL, 0);
	}
	void test(void)
	{
		MessageBoxA(NULL, "test", NULL, 0);
	}
};
__declspec(dllexport) DllA01 gA01;
extern "C" __declspec(dllexport) void dllA01Test(void)
{
	MessageBoxA(NULL, "dllA01Test", NULL, 0);
}

在ExeB中加入

1
2
3
4
#pragma comment(lib, "DllA.lib")
#pragma comment(linker, "/include:__imp__dllA01Test")
//#pragma comment(linker, "/include:__imp_?gA01@@3VDllA01@@A")
//#pragma comment(linker, "/ENTRY:foo")

休眠后启动移动硬盘不重新初始化连接

比如有这样的需求,VMWare的虚拟机放在移动硬盘中,虚拟机一直开着,有时需要离开一会,就让机器休眠了,结果回来唤醒机器后,发现由于插在USB口上的移动硬盘重新初始化了,VMWare一直连接着的文件句柄也就失效了,结果就是运行中的这个移动硬盘上的虚拟机崩了。

这是个很严重的问题,这让人无法将虚拟机放在移动硬盘中运行。

一直都在找如何让Windows唤醒后不初始化移动硬盘而应该一直保持休眠前的状态的方法,没有如果。

这几天买了一个新的移动硬盘,一直插在机器上用,因有事去办就休眠了机器,回来唤醒机器,发现并没有像以前那个移动硬盘那样新弹出移动硬盘的根目录文件夹窗口。

哦,明白了,以前的移动硬盘是机械硬盘,而新买的移动硬盘是固态的,唤醒机器时固态的可以直接进入工作状态,不需要重新初始化,也就说明VMWare虚拟机可以安全地在固态移动硬盘上运行,不怕机器休眠!

GetHDSerial编译不通过

源码参见https://www.codeleading.com/article/62852336906/
提示

1
2
3
4
error C2065: “STORAGE_PROPERTY_QUERY”: 未声明的标识符
error C2065: “StorageDeviceProperty”: 未声明的标识符
error C2065: “PropertyStandardQuery”: 未声明的标识符
error C2065: “IOCTL_STORAGE_QUERY_PROPERTY”: 未声明的标识符

按F1在msdn上查到的可能结果为

1
#include <Ntddstor.h>

但加了还是编译不通过,其实正确的是只要加入

1
#include <WinIoCtl.h>

refer to: https://stackoverflow.com/questions/4420632/i-dont-know-what-problem-it-is-error-error-c2065-storage-property-query

删除win10下的20G恢复分区

现在很多笔记本都内置了一块固态硬盘用于跑win10系统,用磁盘管理工具可以发现这块硬盘上有20G的恢复分区休眠着,本来固态硬盘的大小就捉襟见肘,而这20G能否删除呢?

如果win10用得得心应手,不担心以后会出现系统要恢复出厂设置的问题,并且在磁盘管理工具中看到的这二十多G分区在系统分区之后,则可以删除这20G分区,并合到系统分区中。我是指不重装系统或不用专业的磁盘分区移动软件的情况下。

由于是系统运行在系统分区中,只能用winpe装U盘引导机器去干这件事。

方法如下:

  1. 网上有各种各样的winpe iso可供下载,但考虑到安全性,还是到微软官网下载adk之类的包。
  2. 装完后,以管理员方式运行“部署和映像工具环境”。
  3. 运行命令

    1
    2
    
    copype amd64 d:\WinPE_amd64
    MakeWinPEMedia /UFD d:\WinPE_amd64 P:

    其中P:为插入的U盘盘符。

  4. 如果提示格式化错误,运行命令

    1
    
    MakeWinPEMedia /ISO d:\WinPE_amd64 d:\winpe.iso

    再参见在linux虚拟机中将ISO写入U盘

  5. 机器插入U盘后开机,比如DELL G7是,开机时反复点击F12键,而不是一直按着F12不动,进入bios,设置成non-secure boot,再重启进入winpe环境。
  6. 进去后就一个dos窗口,运行diskpart,在此程序里多敲help看命令帮助,list是查看磁盘、分区等信息,select是进入磁盘,再进入分区,把系统分区后的分区都delete掉,再将系统分区extend到之后的所有空闲空间。注意这里操作一定要小心再小心,因为没有OS的保护,一不小心会把系统分区或引导分区删了,那就game over了,小心小心再小心!
  7. 完成扩容后,exit退出重启,再反复点击F12键进bios设成为secure boot,再重启进入win10,就可看到c:盘增加了十几G的空间了。

Failed to format -2147024809

直接用adk里的MakeWinPEMedia写winpe到U盘里报标题这个错误,所以我们换一种思路,用MakeWinPEMedia生成iso,再在linux环境将iso擦写到U盘里。

先以管理员方式运行“部署和映像工具环境”
输入

1
MakeWinPEMedia /ISO d:\euhat\WinPE_amd64 d:\winpe.iso

成功后,将winpe.iso拷贝到ubuntu linux虚拟机或实机里面。
我们现在以vmware的ubuntu虚拟机为例,为了使虚拟机正常识别U盘,需要做两件事

  1. 以管理员方式运行vmware player或workstation。
  2. ubuntu虚拟机设置里USB控制器兼容性中选择正确的版本,新买的机器一般选USB 3.0以上。这一步骤或选错,在vmware工具条上将U盘连接到虚拟机里时会提示“无法连接到理想的主机控制器。将尝试将该设备连接到可用的最佳主机控制器”不成功的错误,那时再重复此步骤选择其它USB控制器版本试试。

启动ubuntu虚拟机,打开终端以root身份运行

1
fdisk -l

通过看容量找到U盘的设备路径,如我这里是/dev/sdb,则再运行

1
2
dd if=/home/euhat/Desktop/winpe.iso of=/dev/sdb
sync

这样winpe就写入U盘了,正常从虚拟机、Windows卸载U盘后,再插到机器上用U盘引导试试!

从哪里下载fc游戏的midi音乐

现在从网上下载什么东西都需要付费,下载红白机游戏中的音乐也是。

其实,fc游戏盛行的年代midi格式还未诞生,fc卡带中存音乐的格式是nsf格式,对于一段完整音乐,nsf格式所需要的存储空间只有midi格式的十分之一。

我找到的播放nsf格式音乐效果最棒的工具是VirtuaNSF,这是VirtuaNes的作者顺便带给我们的礼物,我下载的版本是1.0.2.2,支持nsf文件的直接拖放。

而由于mid格式是garaband和cubase都支持的格式,更利害的是可以直接转换成五线谱,这对学音乐有莫大帮助,所以就要用到nsf2midi这个工具。

附我找到的免费nsf音乐合集,手慢无。
http://fcnes.ys168.com/
音乐相关区下NSF开头的文件就是。