2007年9月3日

昨天我打开服务禁用了不常用的服务,终端服务(Terminal Service)。今天打开VS调试就出错,哈哈, 居然必须得开启终端服务。

解决不能调试的办法:

1. 将工程属性->Debug->Enable the Visual Studio hosting process前的选中标志去掉.
2. 启动Terminal Services服务.
发表于 2007-09-03 22:41 肉丝 阅读(2557) | 评论 (28)编辑 收藏

2007年4月4日

代码如下: (为了这个问题,在MSN上少打了一个\引来了。。。。。。,这个死失血^_^)

此代码作用是按行读取一个文件

#include
void test()
{
std::ifstream file("c:\\我的中文目录\\test.txt");
if(!file.is_open())
return FALSE;

while(file.good())
{

char buffer[1024];
file.getline(buffer, 1024);

}
file.close();

}

结果
1.在VC6.0 中结果运行正常

2.在VS .NET 2003 中(没有试过,估计也正常)

3.在vs .net 2005中不正确啦, is_open返回为false了
原因:
跟踪代码发现_Fiopen用的是wchar_t( 我想可能是盖子不想在WIN98下运行了,所以全部支持NT,自然就是wchar_t类型了。)
/*
这段为盖子打开文件的源代码

_MRTIMP2_NCEEPURE FILE *__CLRCALL_PURE_OR_CDECL _Fiopen(const char *filename,
ios_base::openmode mode, int prot)
{ // open wide-named file with byte name
wchar_t wc_name[FILENAME_MAX];


if (mbstowcs_s(NULL, wc_name, FILENAME_MAX, filename, FILENAME_MAX - 1) != 0)
return (0);
return _Fiopen(wc_name, mode, prot);
}
*/
另mbstowcs_s读取的时候_LocaleUpdate.localeinfo (这个与下面要讲的那个函数有关)

解决主法:
1.setlocale(LC_ALL, ""); 设置一下就OK了 //C语言的
2.std::locale::global(std::locale(""); // 标准库

结尾: STL真恼火, 兼容,BUG.(盖子的原因)

发表于 2007-04-04 16:10 肉丝 阅读(5025) | 评论 (7)编辑 收藏

2007年4月2日

以为以VC6.0开发工具为例, .NET C++是一样的。
可以使用控制台, WIN32, ATL (.NET 的ATL用的模板,而VC6.0不是)。
程序框架主要由两部分板成, 一个服务主函数(ServiceMain),另一个是用于服务管理控

制用的(ServiceControlHandler)。
一、步聚:
1. 注册服务
2.启动服务

二、代码编写

#include "windows.h"
#include "winsvc.h"

SERVER_STATUS g_ServiceStatus; //用于存放当前服务状态, 启动, 停止, 恢复。。。


SERVICE_STATUS_HANDLER g_ServiceStatusHandler; //控制句柄

void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv); //记住要加WINAPI, 为啥

原因自己想喽
void WINAPI ServiceControlHandler(DWORD dwOpcode); //状态控制
void InstallService();
void UnInstallService();

int main()
{
SERVICE_TABLE_ENTRY DispatcherTable[] = {{_T("Your Server Name"), NULL},

{NULL, NULL}}; //为啥用两个,国际惯例哈。
StartServiceCtrlDispatcher(DispatcherTable);
}

void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv)
{
g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; //启动状态
g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; //为啥用这个参

数去看MSDN
g_ServiceStatus.dwControlsAccepted = SERVICE_ACCPET_STOP; //我仅接受停止,

恢得,暂停自己加就行了
g_ServiceStatusHandler = RegisterServiceControlHandler(_T("Your Server

Name"), ServiceControlHandler);//注册控制函数啦
if(g_ServiceStatusHandler == (SERVICE_STATUS_HANDLER) 0)
return;
g_ServicveStatus.dwServiceState = SERVICE_RUNNING; //置运行状态

if(!SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus))
return;
//这里开始放置你的处理线程或代码了
.....
}

void WINAPI ServiceMain(DWORD dwOpcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
g_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;

case SERVICE_CONTROL_CONTINUE:
g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
g_bIsRunning = TRUE;
break;
case SERVICE_CONTROL_STOP: //因为我只设了停止
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus);
g_bIsRunning = FALSE;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}

}

//安装服务
void InstallService()
{
TCHAR szDir[_MAX_PATH];
DWORD dwRet = GetModuleFileName(NULL, szDir, _MAX_PATH);
szDir[dwRet] = _T('\0');
SC_HANDLE hSCM, hService;
hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCM)
return;
hService = ::CreateService(hSCM, _T("Your Service Name"), _T("Your Service

Name 描述"),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szDir,
NULL,
NULL,
NULL,
NULL,
NULL);
if(!hService)
return;
}

//缺载服务
void UnInstallService()
{
SC_HANDLE hSCM, hService;
hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCM)
return;

hService = ::OpenService(hSCM, _T(”Your Service Name"),

SERVICE_ALL_ACCESS);
if(!hService)
return;
::DeleteService(hService);
CloseServiceHandle(hService);

}

代码有通不过的地方,自己改哈, 有啥不正确之处欢迎各位指正。
发表于 2007-04-02 17:38 肉丝 阅读(1516) | 评论 (0)编辑 收藏

2007年3月30日

在我们的语句中有时有用到NOT IN 语句, 但是用这条语句时存在一定的问题。
1.NOT IN
SELECT '有' WHERE 1 NOT IN(20, NULL)


---
(所影响的行数为 0 行)


分析: 按理说1本身就不是20, NULL值里,应该 有返回值。
2.使用IN
SELECT '有' WHERE 1 IN(1, NULL)

---

(所影响的行数为 1 行)
3.根据SQL SERVER的说明,被比较值的类型比较与比较值的类型一值, NULL不算任何类型就像VARIANT中的VT_NULL一样只一个标志吧。
例如:
SELECT '有' WHERE 1 NOT IN(20, CAST(NULL AS INT))
---
(所影响的行数为 0 行)
结果还是为0。

总结: 在比较时将被比较值转换为比较值的类型, 所以我们用时要注意。其次在比较值大小等操作时如无特殊需求就将为NULL的去掉。
例: SELECT * FROM TABLE_NAME WHERE COLUMN_NAME IS NULL
--说明不能用 COLUMN_NAME = NULL哦。相反的就是NOT COLUMN_NAME IS NULL 或者 COLUMN_NAME IS NOT NULL
为啥原因不行, 上面我已经讲了哈。

发表于 2007-03-30 23:07 肉丝 阅读(1689) | 评论 (1)编辑 收藏

2007年3月28日

在ACCESS中会出现#数字!, 而在程序或SQL中会出现NULL

示例数据
字段1 字段2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

ii
ddd

1.如果用SELECT * FROM [EXCEL 5.0;DATABASE=C:\Test.xls].[sheet1$]查询出来,那么 22后面的全为NULL值
2.那么用SELECT * FROM [EXCEL 5.0;HDR=YES;IMEX=1;DATABASE=C:\Test.Xls].[sheet1$]查询, 后面的值还会是NULL,为什么呢?在这种情况下前八行必须有一个是以符存储的,也就是在单元格前加一个单引号('1), 用这种方法就OK了。
3.那么如果前8行没有用又咋办呢?
那么把第一行不当做字段名就行了
SELECT * FROM [EXCEL 5.0;HDR=NO;IMEX=1;DATABASE=C:\Test.xls].[sheet1]

好了, 三种方案根据实际情况任选喽。
发表于 2007-03-28 11:43 肉丝 阅读(1634) | 评论 (4)编辑 收藏

2007年3月27日

在我的项目中有个地方需要存储自己的文件结构,使用微软的复合文件存储API是比较好的方法, 复合文件中的提法及存储方式我就不介绍了。(两个名词,存储Storage--IStorage, 流Stream--IStream)
以下主要对一个存在的文件或存储进行修改的方法:(其实也不重要,但是很容易忽略)

HRESULT hr = S_FALSE; //具体原因为啥用S_OK, S_FALSE参考COM
wchar_t wszFileName[] = L"c:\\mydoc.txt"; //复合文件路径

IStroage *pRootStg = NULL; //根存储
if(::StgIsStorageFile(wszFileName) == S_OK)
{
//是个复合文件
hr = ::StgOpenStorage(wszFileName, NULL, STGM_READWRITE | STGM_SHARE_EXECLUSIVE | STGM_DIRECT, NULL, 0, &pRootStg);
if(hr == S_OK)
{
//打开成功
}

}
else
{
//错误的复合文件格式
hr = ::StgCreateDocfile(wszFileName, STGM_READWRITE| STGM_SHARE_EXCLUSIVE |STGM_DIRECT|STGM_CREATE,
0, &pRootStg);
if(hr == S_OK)
{
//打开成功
}
}

对于流也是一样的用法, 总之一句话。 如果想在原来的基础上增加子存储或节点的话, 不用能CreateStorage与CreateStream, 得用打开->创建方式.

发表于 2007-03-27 14:29 肉丝 阅读(1556) | 评论 (2)编辑 收藏

2007年1月26日

因为IPicture接口提供了SaveAsFile,实际上是保存在IStream(流)中,那么就可放剪切板或者保存在文件中,但是此时所占用的大小与原先装入(OleLoadPicture)时的大小不一致,因为被m$修改了啦。

方法如下:

HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, 0); //因为你不知道图像存储需要多少空间,所以设置为0
if(hGlobal)
{
     IStream* pStream = NULL;
     HRESULT  hr = ::CreateStreamOnHGolbal(hGlobal, TRUE, &pStream);
     if(SUCCEEDED(hr))
    {
            LONG cbSize = 0;
            hr = pPicture->SaveAsFile(pStream, FALSE,  &cbSize);
            {
                    BYTE* pByte = (BYTE*)  ::GlobalLock(hGlobal);
                    //操作你的数据...
                    ::GlobalUnLock(hGlobal); 
            }
    }    
     ::GlobalFree(hGlobal);
    pStream->Release();

}

发表于 2007-01-26 10:08 肉丝 阅读(1523) | 评论 (0)编辑 收藏

2007年1月19日

写了一个MFC ActiveX , 由于程序需要在控件生命周期内都需要使用控件的接口指针通过
GetIDispatch(TRUE)来获取, 但是只要我不释放该指针, 该类的析构函数是无法执行的,另释放执行放在什么地方? WM_CLOSE,WM_DESTROY? 这两个是不行的。

梆菜姐姐看到就好了~~~~~,期待ing......

发表于 2007-01-19 16:12 肉丝 阅读(1393) | 评论 (0)编辑 收藏

2006年12月24日

http://news.163.com/06/1224/06/333C92JV0001124J.html(第二次)
刚好这事件发生离我不远,真是感到又气又悲,这就是21世纪的人性 ,将别人的命当作一根草来看待。
对于该两次事件中 ,第一次肯定是那个开奔驰的人故意的。第二次也有可能,因为倒了车,肯定不会再往前挂档,现在每个人都知道,压到人如果没有死,有可能陪的钱远比死亡的钱多出很多(这就是潜规则),所以很多司机选择压死人或者逃逸,说到这儿,我想起前两天也发生在成都,一位老太婆被撞死,肇事者逃逸(不知道我们伟大的警察同志抓到没有,为什么伟大呢 ,他们辛苦了,这么多事情要他们来处理,太难为他们了,建议多招些处理这类事情的警察),唉~~~,就在前些日子, 在我们小区外边的路口, 一辆灌灌车将一位骑车的女的(因为我没有在目击现场)撞出十多米远(天啦,那里不是主车道呀,而且很多行人要走那儿过呀),脑浆到处都是。

我提出的我疑问:
1.为什么很多人不遵守。
2.为什么法律管不了这些人?
3.酒后驾车的人在当今社会占多少比例?为什么他们敢酒后驾车?





发表于 2006-12-24 22:55 肉丝 阅读(2819) | 评论 (5)编辑 收藏

2006年11月19日

3448病毒这个作者有够毒的, 修改IE默认页, 修改EXPLORER,使其加载驱动。 如果搜索3448 病毒的清理,自动关机;或者求救相关网站(YAHOO  )也一样。

使用瑞星卡卡助手就可以干掉了。
发表于 2006-11-19 23:50 肉丝 阅读(2279) | 评论 (3)编辑 收藏