[高分][寻找]高分寻找一本的PDF!!!!!!

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

Visual C++程序开发范例宝典
书号:9787115159700
寻找这本书的PDF
我的信箱:mnjie.5520@yahoo.com.cn

2007年7月才出来的
应该还没有电子版吧。!
  确实是一本好书。
网上本书的光盘还是有的了。

2楼大侠 好强~~~

晕 不是书… 感觉自己很幼稚…

是书啊

下载代码就行了,这本书我买了,讲的很粗,代码网上有下的。

这本书没有电子版的

这本书目前还没有电子版

up

Tags: , ,

[组件][部署]关于COM+组件部署的问题

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

大家好:

在下在COM+组件部署的时候遇到以下疑问,望高手解答:

1.在完成COM+组件的开发后,首先完成COM+ SERVICE在COM+ 服务器complus(该服务器之前已加入domain.com域)端的安装。

2.在COM+ 服务器的组件服务里找到该组件应用程序,选择属性里的ACTIVATION TAG, 修改REMOTE SERVER NAME 为该服务器的主机名+域名,e.g. complus.domain.com.

3.从COM+ SERVICE 以APPLICAITON PROXY的方式导出该组件COM+ 应用程序安装包proxy1.msi.

4.在ClientA 上安装该proxy1.msi

5.安装后,在ClientA的组件服务中找到该组件应用程序,查看属性中的ACTIVATION TAG,发现REMOTE SERVER NAME仅为COM+服务器的主机名complus,而不是完整的域名complus.domain.com.

6.修改ClientA中该组件的REMOTE SERVER NAME从主机名为完整的域名complus.domain.com后, 从ClientA再次以APPLICATION PROXY的方式导出COM+ 应用程序安装包proxy2.msi.

7.在ClientB上安装该proxy2.msi.

8.安装后,在ClientB的组件服务中找到该组件应用程序,查看属性中的ACTIVATION TAG,发现REMOTE SERVER NAME为完整的域名complus.domain.com.

请问:

1.为什么第一次由组件服务器导出的application proxy,在客户端部署后无法包含完整的域名,而第二次从组件客户端导出的application proxy在部署后却能包含完整的域名?

2.请问由组件客户端再次导出的application proxy跟由组件服务器端导出的application proxy,它们之前有何不同?

如果各位高手在回答时能够给出比较权威的出处,在下将不甚感激:)

没做过,UP

兄弟,帮你顶,都不会,关注!~

大家好,其实这个只是一个COM+组件部署规范的问题,但是我在MSDN上无法找到确切的说明,只有在这里请教专家了。我感觉我的第一个问题像是MS的BUG.

你的服务器是不是就是主域控制器, 因为客户端机器与服务器通信必须加上域名的路径,而在服务器上是机器本身,域名就是本机,本机就是域名,所以MSN默认就把域名给去掉了,个人的理解,不是权威出处

谢谢你的回复,我的组件服务的计算机不是域控,属于域成员,而第一次安装PROXY的客户端也属于域成员

Tags: , ,

[OpenCV][安装][配置]OpenCV安装配置问题

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

网站上下载了OpenCV的最新版,清理解决方案,rebuild all,编译器崩溃,原因不明,且每次崩溃的项目不同。因此单独编译其中的每个项目,仍然有错误:
1,项目CV:编译通过。
2,项目Cvaux:编译错误3个,都是forground_regions函数找不到。
1>.cvbgfg_acmmm2003.cpp(411) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'
1>.cvbgfg_acmmm2003.cpp(416) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'
1>.cvbgfg_gaussmix.cpp(343) : error C2039: 'foreground_regions' : is not a member of 'CvGaussBGModel'
3,项目Cvinfo:编译通过,但显示:
1>LINK : 没有找到….incvinfod.exe 或上一个增量链接没有生成它;正在执行完全链接
4,项目Cvsample:编译4个项目,第一次VS2005崩溃退出,原因不明,第二次编译通过,但显示:
1>LINK : 没有找到….incxcore100d.dll 或上一个增量链接没有生成它;正在执行完全链接
2>LINK : 没有找到….in/highgui100d.dll 或上一个增量链接没有生成它;正在执行完全链接
3>LINK : 没有找到….incv100d.dll 或上一个增量链接没有生成它;正在执行完全链接
2>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用/NODEFAULTLIB:library
4>LINK : 没有找到.cvsampled.exe 或上一个增量链接没有生成它;正在执行完全链接
5,项目Cvtest:先清理Cvtest,然后编译6个项目,第1-2次VS2005崩溃退出,原因不明,第3次编译通过,但显示4个成功,2个失败。
1>LINK : 没有找到….incxcore100d.dll 或上一个增量链接没有生成它;正在执行完全链接
3>LINK : 没有找到….incxts001d.dll 或上一个增量链接没有生成它;正在执行完全链接
2>LINK : 没有找到….incv100d.dll 或上一个增量链接没有生成它;正在执行完全链接
4>LINK : 没有找到….in/highgui100d.dll 或上一个增量链接没有生成它;正在执行完全链接
4>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用/NODEFAULTLIB:library
5>.cvbgfg_acmmm2003.cpp(411) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'
5>        c:Program FilesOpenCVcvauxincludecvaux.h(1240) : see declaration of 'CvFGDStatModel'
5>.cvbgfg_acmmm2003.cpp(416) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'
5>        c:Program FilesOpenCVcvauxincludecvaux.h(1240) : see declaration of 'CvFGDStatModel'
5>.cvbgfg_gaussmix.cpp(343) : error C2039: 'foreground_regions' : is not a member of 'CvGaussBGModel'
5>        c:Program FilesOpenCVcvauxincludecvaux.h(1300) : see declaration of 'CvGaussBGModel'
6>LINK : fatal error LNK1104: 无法打开文件“cvauxd.lib”
6,项目Cxcore:编译通过,但显示:
1>LINK : 没有找到….incxcore100d.dll 或上一个增量链接没有生成它;正在执行完全链接
7,项目Cxcoretest:编译3个通过,但显示:
2>LINK : 没有找到….incxts001d.dll 或上一个增量链接没有生成它;正在执行完全链接
8,项目Cxts:编译3个通过,但显示:
2>LINK : 没有找到….incxts001d.dll 或上一个增量链接没有生成它;正在执行完全链接
9,项目highgui:编译通过,但显示:
1>LINK : 没有找到….incxcore100d.dll 或上一个增量链接没有生成它;正在执行完全链接
2>LINK : 没有找到….in/highgui100d.dll 或上一个增量链接没有生成它;正在执行完全链接
2>  正在创建库….lib/highguid.lib 和对象….lib/highguid.exp
2>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用/NODEFAULTLIB:library
10,项目ml:编译通过,但显示:
1>LINK : 没有找到….incxcore100d.dll 或上一个增量链接没有生成它;正在执行完全链接

你可以打开cvaux.h,在1137行CvMemStorage*  storage;后面的注释语句出问题了,把注释语句删掉应该就好了

从cvs获取的代码并不能保证随时可以编译过,多更新代码几次,问题肯定会有人修复的

UP

引用 2 楼 linglongyouzhi 的回复:
你可以打开cvaux.h,在1137行CvMemStorage*  storage;后面的注释语句出问题了,把注释语句删掉应该就好了

这个注释去掉之后编译有出现了
->Release()不是成员函数等一堆的其他错误。

这个官网都有详细的配置教程,我的可以用的

Tags: , , ,

[疑难][100分][导致]【疑难求助100分】什么情况会导致程序异常但是主线程句柄却是有效的

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

我们程序的基本框架是这样的:

一个进程监控其他几个进程,使用它们的主线程句柄作为信号量,来判断其是否正常。
现在出现的情况是:其中一个进程已经挂了(对所有的操作都不响应了,连窗口都无法打开),
但是监控进程却无法检测到信号量,即它的主线程句柄还是有效的。

不知什么情况下会出现这种现象,谢谢大家了。麻烦你举例说明,可以另外加分,再次感谢!

对所有的操作都不响应了,连窗口都无法打开

这并不意味线程结束了。失去响应的情况很多,典型的例子就是由于逻辑错误使主线程进入死循环。但如果操作系统没有结束它,或认为结束它,它就一直在。

所以这种办法似乎不是太有效

你有点误解,正常情况下,被监控程序退出时(正常退出或者异常),
其他主线程句柄的信号量将自动触发,使监控线程能够知道。

当然可以通过你提到的Keep Alive来避免这种情况,程序还是“正常”的,但是不工作了

2楼说的挺清楚的了,你应该用1楼的方法。

你想想:
你监控的进程被死锁了,卡死在某上地方不断的等待,但他并不是退出或者异常,这时他还能按你说的那样:

“其他主线程句柄的信号量将自动触发,使监控线程能够知道。 ”

呵呵,你的这个方法确实不是很合理,用一楼的方法好一点。你不出错的话,一楼的方法并不会像你说的那样“正常,但是不工作了”,如果卡死了或者线程被挂起了,他不工作了,监控进程在一段时间后就认为他不是alive的。

并不是句柄还在,程序就一定会工作
应该是判断程序是否正常工作比较好

使用心跳,如果心跳都停了,那也快挂了。

gz

窗口程序,可以用WaitForInputIdle重新设计一个等待过程试试.

Tags: , , ,

[对话]对话框的问题

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

在一个主对话框中建一个非模态对话框
在主对话框中点击一个按钮,然后在那个非模态对话框中的编辑框中显示出来
这怎么实现,麻烦各位大虾指导的详细点

大哥还是感谢你!
可能我没说得很清楚
你没明白我的意思
不过我已经搞定了

怪我 太晚了 看东西都迷糊了 嘿嘿
搞定就好

Tags: ,

[仪器][循环][监测]仪器循环监测timer函数请帮忙

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

我是要远程控制一些仪器进行循环监测我的一些信号,循环监测我用的settimer,现在的问题是我关闭程序的时候onclose执行完后竟然程序跑到ontimer函数的一个仪器监测函数里面但是在这里报错,错误是内存地址违规访问,是不是跟仪器有关系,但是问题是我在onclose里面把所有的仪器都close了一下,请大侠们指点一下,还有现在考虑是否不用ontimer改为线程循环监测比较好呢?

我一进onclose就killtimer了,还有我觉得onclose了进不会在响应ontimer了吧,还有如果我只是进行一次timer测试完整个流程后在关闭就不会有这个问题,

up

可能是次序问题?
先killtimer, 后做仪器close.

OnClose中先KillTimer。如果还有问题,就定义一个开关变量,用此变量来控制OnTimer是否执行。

先KillTimer

Tags: , , ,

[socket][发送][字节]socket发送字节数

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

socket一次发送字节数量有没有限制,如果有是多少?

这个不能确定的吧,要看网络状况和你的系统

尽量一次别发的太多!

对于 message oriented sockets,可以调用 带 SO_MAX_MSG_SIZE 选项的 getsockopt 函
/////////////////////
这种类型的socket如何建立?

没有限制,至少MSDN说明的send参数是指针和发送长度。

多大的缓冲区要看系统底层如何处理。

到底多大,测试一下就知道。

Tags: , , ,

[GetExitCodeThread][使用]关于GetExitCodeThread()的使用

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

我再对话框程序中设置了线程终止按钮,来终止两个线程,代码如下:
void CCreateRectDlgDlg::OnTerminateThread()
{
DWORD dwexitcode1=0,dwexitcode2=0;
TerminateThread(m_thread1->m_hThread,dwexitcode1);
TerminateThread(m_thread2->m_hThread,dwexitcode2);
}
m_thread1和m_thread2存放了创建两个线程时AfxBeginThread()的返回值。

对话框中又设置了两个按钮,点击出现线程1或线程2的状态提示框,按钮1代码:
void CCreateRectDlgDlg::OnThread1State()
{
LPDWORD lpexitcode=NULL;
if(GetExitCodeThread(m_thread1->m_hThread,lpexitcode))
{
if (*lpexitcode == STILL_ACTIVE)
MessageBox("线程1在执行");
else
MessageBox("线程1经退出");
}
else
MessageBox("获取退出代码失败");
}
按钮2代码:
void CCreateRectDlgDlg::OnThread2State()
{
LPDWORD lpexitcode=NULL;
if(GetExitCodeThread(m_thread2->m_hThread,lpexitcode))
{
if (*lpexitcode == STILL_ACTIVE)
MessageBox("线程2在执行");
else
MessageBox("线程2经退出");
}
else
MessageBox("获取退出代码失败");
}

问题是:让两个线程开始画图,然后按线程终止按钮终止线程后,再按按钮1或按钮2来显示状态时系统出错,不知道问题处在了哪里,请教大家

Tags: , ,

[实现][服务器][客户端]怎样让ATL实现的COM服务器与多个客户端连接

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

小弟做的COM服务器需要与两个客户端连接,一个是IE,一个是DLL库,现在需要实现的功能是IE发送消息到COM,COM再转发到DLL,通过IDispatch我只能实现IE发送消息到COM,COM怎么样发送到DLL呢?IE和DLL都连接到COM了,但连接表里只有一个连接,我的感觉是他们分别连接了这个COM的两个对象而已,所以连接表里只有一个连接。

你的感觉是对的,有两个组件存在。你可以把你的组件设置成SINGLETON模式,组件只会创建一个,所有客户端共享同一个组件

恩,用jamesshooo兄的方法,单实例模式

我看了,我本来就是Single模式的
class ATL_NO_VTABLE CCmdCtrl :
public CComObjectRootEx <CComSingleThreadModel>,
        …
还是不行呢,是不是有其他原因呢?

我在事件接口中查看连接数,如下nConnections每次都为1
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
    …
}

你这是单线程套间,不是单实例模式,在类里面添加下面的一句宏就是单实例
public:
  DECLARE_CLASSFACTORY_SINGLETON(CCmdCtrl)

果然如此,搞定了,多谢jamesshooo了,一会儿就给分哈。
还有个问题,我能不能从
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
    pT->Lock();
    CComPtr <IUnknown> sp = m_vec.GetAt(nConnectionIndex);
    pT->Unlock();
    IDispatch* pDispatch = reinterpret_cast <IDispatch*>(sp.p);
    …
}
中获取的pDispatch判断到底当前是要调用哪个客户端的函数呢?该怎么判读呢?

果然如此,搞定了,多谢jamesshooo了,一会儿就给分哈。
还有个问题,我能不能从
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
    pT->Lock();
    CComPtr <IUnknown> sp = m_vec.GetAt(nConnectionIndex);
    pT->Unlock();
    IDispatch* pDispatch = reinterpret_cast <IDispatch*>(sp.p);
    …
}
中获取的pDispatch判断到底当前是要调用哪个客户端的函数呢?该怎么判读呢?

只能根据索引来判断,谁第一个挂接连接点的索引小,最后挂接的索引大

study.

自己加了个链表,先将就用,把BOSS忽悠过了再说,没时间研究了。

Tags: , , ,

[程序][界面][老死]我一个MFC的程序为什么界面老死掉

09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »

一个线程死循环,(10秒间隔)不停的读数据库
启动后,界面就卡死在那里
怎么搞

//查询看有新的数据添加进去没有

UINT SqlThreadProc(LPVOID param){
CString cid;
CString msql="update emd_message  set STATUS_FLAG =1 where command_id = ";
CLog log;

CDataBase dbs;
dbs.getConn();

CClient client;
char* locoMess;

while(TRUE){
Sleep(5000);
try{
dbs.getRec();
dbs.pRec->Open("select command_id as cid,command_data as cd from emd_message where STATUS_FLAG =0",
dbs.pConn.GetInterfacePtr(), //获得库连库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText
);

_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){

cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);

client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}
dbs.closeRec();
}catch(_com_error &e){
log.log("SqlThreadProc");
log.log(e.ErrorMessage());
}
}
return 0;
}

//查询看有新的数据添加进去没有

UINT SqlThreadProc(LPVOID param){
CString cid;
CString msql="update emd_message  set STATUS_FLAG =1 where command_id = ";
CLog log;

CDataBase dbs;
dbs.getConn();

CClient client;
char* locoMess;

while(TRUE){
Sleep(5000);
try{
dbs.getRec();
dbs.pRec->Open("select command_id as cid,command_data as cd from emd_message where STATUS_FLAG =0",
dbs.pConn.GetInterfacePtr(), //获得库连库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText
);

_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){

cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);

client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}
dbs.closeRec();
}catch(_com_error &e){
log.log("SqlThreadProc");
log.log(e.ErrorMessage());
}
}
return 0;
}

//查询看有新的数据添加进去没有

UINT SqlThreadProc(LPVOID param){
CString cid;
CString msql="update emd_message  set STATUS_FLAG =1 where command_id = ";
CLog log;

CDataBase dbs;
dbs.getConn();

CClient client;
char* locoMess;

while(TRUE){
Sleep(5000);
try{
dbs.getRec();
dbs.pRec->Open("select command_id as cid,command_data as cd from emd_message where STATUS_FLAG =0",
dbs.pConn.GetInterfacePtr(), //获得库连库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText
);

_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){

cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);

client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}
dbs.closeRec();
}catch(_com_error &e){
log.log("SqlThreadProc");
log.log(e.ErrorMessage());
}
}
return 0;
}

主线程同时都做哪些事?界面是自己绘制的吗?如果不启动工作线程会不会有问题?

_variant_t cstr;
CString str;
while(!dbs.pRec->adoEOF){

Sleep(0); // 加上试试

cstr=dbs.pRec->GetCollect("cid");
str = (char*)_bstr_t(cstr);
msql+=str;
cstr=dbs.pRec->GetCollect("cd");
locoMess=(char*)_bstr_t(cstr);

client.SendString(locoMess);
CDataBase db1;
db1.getConn();
db1.insertSql(msql);
db1.closeConn();
dbs.pRec->MoveNext();
}

你是不是在主线程加了类似WaitForSingleObject(hThread, INFINITE);的语句啊

死锁

Sleep(0); // 加上试试

加上了,好了
LSD可以说说原因不

显然主界面线程没有执行消息循环,在其他地方就已经阻塞了

Sleep(0);

释放该线程时间片给界面线程,用于处理界面响应。

Tags: , , ,