VB6 ActiveX OCX IIS
环境:WinXP SP2+IIS6+VB6用VB6 建立并编译了一个ActiveX OCX(一个窗体,窗体上只有一个按钮,点按钮显示hello)
在VB6中运行会出一个IE窗口,内有我建立的窗体,点按钮正常显示hello
于是,我在这个IE窗口中选菜单“文件”>“另存为”,将网页存于桌面上,名为usercontrol1.html
我双击桌面上这个html文件,也能正常打开和运行ActiveX
又于是,我把这个桌面上的html文件复制到wwwroot下
并在IE中输入网址:http://127.0.0.1/usercontrol1.html,这回网页中不正常显示,只显示一个小小的方块,里面一个小点(应该是显示不出内容时的占位符)
注:我的IIS运行正常,因为我可以用http://127.0.0.1/index.html打开网页
我试着改改IIS目录的访问权限,也没效果。
怎么办? --------------------编程问答-------------------- http://topic.csdn.net/u/20080128/11/56d652a0-29d0-4606-b8da-f44cff5bd912.html
http://topic.csdn.net/u/20090508/10/32fb3417-2f2b-44a6-8e2c-118c492698d9.html
http://topic.csdn.net/u/20080909/17/febe8ca7-dfb5-4eca-8352-2925bd37bd36.html --------------------编程问答--------------------
能看出楼上是高人,你发的三个链接都看了,但是,由于水平原因,不能从中得到答案,能不能具体说下我的问题的具体解法?
我说的整个过程都发生在同一台电脑上,所以问题的核心是:为什么我通过桌面上的html文件能在IE中本地打开我写的VB ActiveX OCX,而通过本机的IIS就不能?我具体应该做什么? --------------------编程问答-------------------- usercontrol1.html 的内容是什么? --------------------编程问答--------------------
内容只是一个VB6做的 ACtivex OCX
这个usercontrol1.html的产生过程是这样的:
1.启动VB6
2.新建“Activex 控件”
3.出现一个窗口体,我在窗体上放置了一个按钮,双击按钮,里面写上msgbox("Hello")
4.选菜单“文件”>“生成工程1.ocx”
5.点工具栏上的“启动”按钮,出现一个IE窗口,里面有我刚才设计的窗体,点它里的按钮,能显示“hello”
6.在这个IE窗口上选菜单“文件”>“另存为”,把网页存在桌面上,名称保持为“UserControl1.html”
7.完全退出VB6
8.双击UserControl1.html,仍可以正常打开网页,能点按钮并显示“hello”
9.把UserControl1.html复制到wwwroot文件夹中
10.在IE中输入http://127.0.0.1/UserControl1.html,显然找到了网页,但不再显示出VB窗体,只显示一个小小的白正方形框,中间有个小灰点,看起来是个文件找不到时的占位符
注:我的IIS正常工作,访问wwwroot中的其它网页没问题
请不要说工程兼容,我已选了 --------------------编程问答-------------------- 1)添加许可证支持
http://topic.csdn.net/u/20090805/16/906a4f43-c175-4b1d-8059-e6bfd478c20c.html
2)编写安装文件:工程1.inf
[version]
signature="$CHICAGO$"
AdvancedInf=2.0
[Add.Code]
工程1.ocx=工程1.ocx
[工程1.ocx]
file-win32-x86=thiscab
clsid={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
FileVersion=1,0,0,0
RegisterServer=yes
3)用 iexpress.exe 打包 工程1.cab (工程1.inf, 工程1.ocx, 工程1.vbl),并复制到 wwwroot 文件夹。
http://www.cnblogs.com/chaodongwang/archive/2009/02/26/1398717.html
4)UserControl1.html 中添加 codeBase 属性
<HTML>--------------------编程问答-------------------- 谢楼上回复,但还有多处疑问,没想到这个问题是极为复杂的
<BODY>
<OBJECT classid="clsid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
codeBase="工程1.cab#version=1,0,0,0">
</OBJECT>
</BODY>
</HTML>
1.clsid={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 中的clsid如何得到?
2.version是如何写?不能是胡乱写的吧
难道这个问题就没有个一站式的解决方法? --------------------编程问答-------------------- 你复制到Http服务器目录下,除了html文件,还应包含ocx文件,网页要能访问到该文件,并下载的本地
按你的现象看,应该是ocx文件没有复制过去,网页找不到ocx文件,就显示一个小方块了 --------------------编程问答--------------------
//TMsgLogInRes功能函数,主要打印成员函数信息到日志文件
void TMsgLogOutRes::dump(HOfstream& j6){// dump msg head
TMsg::dump(j6);// dump msg body
j6.reopen();j6 << "SystemNo :" << m_sSystemNodeNo << endl;
j6 << "LogoutType :" << m_sLogoutType << endl;
j6 << "ResponseCode :" << y7 << endl;j6.close();}
//TMsgMng处理函数,把消息发送到消息队列
int TMsgMng::sendToQueue(TMsg* tMsg, int iNodeIndex)
{g_pSocketComm->dispatch(tMsg, iNodeIndex);return Right;}
//TMsgMng处理函数,把消息发送到socket
int TMsgMng::sendToSocket(TMsg* tMsg, int iNodeIndex)
{g_pSocketComm->dispatchStraight(tMsg, iNodeIndex);return Right;}
// TMsgMng处理函数,到TSocketComm的消息接收队列中得到一条指定节点号、消息类型的消息。
TMsg* TMsgMng::getMsg(int iNodeIndex, char* pMsgType){
return g_pSocketComm->getOneMsg(iNodeIndex, pMsgType);}
//TMsgMng处理函数,到TSocketComm的消息接收队列中得到一条指定消息类型的消息。
TMsg* TMsgMng::getMsg(int iMsgType){return g_pSocketComm->getOneMsg(iMsgType);}
char m_sStartDateTime[TimeFieldLength + DateFieldLength+1] y1
char m_sStopDateTime[TimeFieldLength + DateFieldLength+1] y2
char m_sStartStreamNo[MsgStreamNoFieldLength+1] y3
char m_sStopStreamNo[MsgStreamNoFieldLength+1] y4
char m_sFeeType[FeeTypeFieldLength+1] y5
char m_sCardType[CardTypeFieldLength+1] y6
char m_sMsgCode[MsgTypeFieldLength+1] y7
char m_sBillState[BillStateFieldLength+1] y8
char m_sBillFileName[BillFileNameFieldLength+1] y9
char m_sResponseCode[ResponseCodeFieldLength+1] j1
virtual int decodeMsg(char* sMsgInBuf, int iMsgInBufLength) j2
virtual int encodeMsg(char* sMsgOutBuf) j3
virtual void dump(HOfstream& tOutStream) j4
char m_sSystemNodeNo[NodeNoFieldLength+1] j5
char m_sBillNumber[BillNumberFieldLength+1] j6
char m_sBillTotalMoney[MoneyFieldLength+1] j7
char m_sLoginType[LogInOutTypeFieldLength+1] j8 --------------------编程问答-------------------- //message.hpp
#ifndef __MESSAGE_H__ #define __MESSAGE_H__ "commondef.hpp" "writelog.hpp"
#ifdef __LINUX__ #include <string.h> #include <stdio.h> #endif
enum TMSGTYPE{LoginReq = 1, LoginRes = 2, LogoutReq = 3,
LogoutRes = 4, TotalCheckReq = 17, TotalCheckRes = 18, FileCheckReq = 31,
FileCheckRes = 32, PayBillReq = 87,PayBillRes = 88};
class TMsgHead{public: TMsgHead(); public:
char m_sMsgLength[MsgLengthFieldLength+1]; //消息长度
char m_sMsgCrypt[MsgCryptFieldLength+1]; //消息加密字段
char m_sMsgStreamNo[MsgStreamNoFieldLength+1]; //消息流水号
char m_sMsgType[MsgTypeFieldLength+1]; //消息类型
char m_sMsgFromNode[NodeNoFieldLength +1]; //消息来源节点号
char m_sMsgToNode[NodeNoFieldLength +1]; //消息目的节点号
char m_sMsgDateTime[TimeFieldLength + DateFieldLength+1]; //消息日期时间
char m_sMsgFeeType[FeeTypeFieldLength+1]; //消息付费类型};
//总对帐请求消息消息段
class TMsgTotalChkFieldReq{public: TMsgTotalChkFieldReq(); public:
y5; //付费类型 y6; //卡类型 y7; //交易类型j6; //帐单总笔数
j7; //帐单总金额};
//总对帐响应消息消息段
class TMsgTotalChkFieldRes{public: TMsgTotalChkFieldRes(); public:
y5; y6; y7; j6; j7; j1; //本段对帐的响应码};
// 用于统计
struct TMsgStat{j6; //帐单总笔数 j7; //帐单总金额
char m_sRespState[1+1];// 响应状态,1 成功,0 失败char m_sOtherInfo[LogOtherInfo+1]; //交易信息
int m_iTradeType; // 1-被动总对帐 2-被动文件对帐 11-主动总对帐 12-主动文件对帐 13 主动无消息对帐
int m_iTotalNum; // 总笔数 int m_iTotalMoney; // 总金额
//主动对帐需要保留的部分信息 char m_sStartStreamNo[25]; // 流水起点
char m_sStopStreamNo[25]; // 流水结束 char m_sMsgDateTime[LEN_DATETIME + 1]; //date and time
char m_sNodeNo[NodeNoFieldLength + 1]; //节点号,4位,大于1000
// 主动对帐时 1 - 对帐结束; 其它, 对帐未结束或没有开始
// 被动对帐时 1 - 结束, 2 - 需要有后续的文件对帐,先不用记录; 其它,未结束
int m_iCheckEnd;char m_sLogserial[LEN_LOG_SERIAL + 1];int m_iNodeIndex;//为总对帐后续文件对帐消息
TMsgStat(){memset(this, 0, sizeof(TMsgStat)); sprintf(m_sRespState, "0"); m_iNodeIndex = -1;}
TMsgStat& operator = (TMsgStat& other){ m_iTradeType = other.m_iTradeType;
m_iTotalNum = other.m_iTotalNum;m_iTotalMoney = other.m_iTotalMoney;
m_iCheckEnd = other.m_iCheckEnd; m_iNodeIndex = other.m_iNodeIndex;
memcpy(m_sLogserial, other.m_sLogserial, LEN_LOG_SERIAL);
memcpy(m_sBillNumber, other.m_sBillNumber, BillNumberFieldLength);
memcpy(m_sBillTotalMoney, other.m_sBillTotalMoney, MoneyFieldLength);
memcpy(m_sRespState, other.m_sRespState, 1);
memcpy(m_sOtherInfo, other.m_sOtherInfo, LogOtherInfo);
memcpy(m_sStartStreamNo, other.m_sStartStreamNo, 24);
memcpy(m_sStopStreamNo, other.m_sStopStreamNo, 24);
memcpy(m_sMsgDateTime, other.m_sMsgDateTime, LEN_DATETIME);
memcpy(m_sNodeNo, other.m_sNodeNo, NodeNoFieldLength);return *this;}}; --------------------编程问答-------------------- class TMsg{public: TMsg(); TMsg(int iMsgType); virtual ~TMsg();
j2; //消息解码 j3; //消息编码 int getMsgType(); //取得消息的消息类型
int getMsgLength(); //取得消息的长度 void setMsgLength(int iMsgLength);
//设定消息的长度 j4; private:int m_iMsgType; //消息类型int m_iMsgLength;
public: TMsgHead m_tMsgHead; //消息头 TMsgStat m_tMsgStat; //统计信息};
//总对帐请求消息
class TMsgTotalChkReq : public TMsg{public: TMsgTotalChkReq();
virtual ~TMsgTotalChkReq();public:y1;y2;y3;y4;
TMsgTotalChkFieldReq m_tChkField[MaxNrOfTotalChkField]; //存放消息段
y5;void setChkFieldCount(int iCount);//设置对帐的段数int getChkFieldCount();
private: int m_iChkFieldCount; //当前有多少个消息段
public:j2; //消息解码j3; //消息编码 j4;};
//总对帐响应消息
class TMsgTotalChkRes : public TMsg{public:TMsgTotalChkRes(); virtual ~TMsgTotalChkRes();
public:j2; //消息解码j3; //消息编码 j4;
public:y1;y2; y3;y4;TMsgTotalChkFieldRes m_tChkField[MaxNrOfTotalChkField];
char m_sFeeType[FeeTypeFieldLength + 1];void setChkFieldCount(int iCount);
int getChkFieldCount();private:int m_iChkFieldCount; //当前有多少个消息段};
//文件对帐请求消息
class TMsgFileChkReq : public TMsg{public:TMsgFileChkReq(); virtual ~TMsgFileChkReq();
public:y1;y2;y3; y4;y5; y6;y7;y8; y9;
public:j2; //消息解码j3; //消息编码 j4;};
//文件对帐响应消息
class TMsgFileChkRes : public TMsg{public:TMsgFileChkRes();
virtual ~TMsgFileChkRes();public:j2; //消息解码
j3;//消息编码j4;public:y1;y2;y3;y4; y5;y6; y7;y8;y9;j1;};
//支付帐单报告包
class TMsgPayBillReq : public TMsg{public:TMsgPayBillReq(); virtual ~TMsgPayBillReq();
public:j2;j3; j4;public:char m_sCardNumber[CardNumberFieldLength+1];
char m_sVCTradeCharacter[VCTradeChaFieldLength+1];char m_sSPTradeCharacter[SPTradeChaFieldLength+1];
char m_sTotalTradeMoney[MoneyFieldLength+1];char m_sOrderNumber[OrderNumberFieldLength+1];
y1;y2;char m_sCallingPartyNumber[CallNumberFieldLength+1];
char m_sCalledPartyNumber[CallNumberFieldLength+1];char m_sSPNo[SPNoFieldLength+1];};
//支付帐单响应包
class TMsgPayBillRes : public TMsg{public:TMsgPayBillRes();virtual ~TMsgPayBillRes();
public:j2;j3;j4;public:char m_sCardNumber[CardNumberFieldLength+1];
char m_sVCTradeCharacter[VCTradeChaFieldLength+1];char m_sSPTradeCharacter[SPTradeChaFieldLength+1];
char m_sOrderNumber[OrderNumberFieldLength+1]; char m_sCallingPartyNumber[CallNumberFieldLength+1];
char m_sCalledPartyNumber[CallNumberFieldLength+1];char m_sSPNo[SPNoFieldLength+1]; j1;}; --------------------编程问答--------------------
谢回复
但那解释不通吧
我另存网存到桌面上时,也没有同时把ocx复制到桌面啊,但能显示啊 --------------------编程问答--------------------
1)usercontrol1.html 中就有。
2)你自己编的程序还不知道版本?是在VB工程属性中指定的,或者直接看 .ocx 文件的属性。
按照我5楼的回复做,就完整了。
你现在就差了打包发布这一步。这应该就是 iis 和本地页面的区别。 --------------------编程问答--------------------
啊,谢大侠不弃的帮助
容我试下 --------------------编程问答--------------------
啊,谢大侠不弃的帮助
容我试下 --------------------编程问答-------------------- 有谁知道如何用VB.net开发解析DWG文件的方法?求高手,最好目前该技术国内教程较多。
补充:VB , 控件