可以创建MFC ActivX control 或者
创建 ATL Project加 ATL Control
为了方便取CLASSID我选用后者做工程,因为MFC自动生成3个UUID,我也搞不懂哪一个才是注册表的那个。(PS:如有高手看到此文,请帮助解答下谢谢。)
Jsp调用OCX需要指定ocx/dll在哪,这需要注册表执行以下命令,注意有些单位变态,你可能没有管理员权限,导致无法执行regsvr32命令
@ECHO installing
copy
D:\ocx\RemtCard\Debug\RemtCard.dll
%windir%\system32\RemtCard.dll
regsvr32 RemtCard.dll
Jsp页面引用如下:(工程下有htm文件,直接COPY)
CLASSID="CLSID:7987BF0A-5F1E-47B5-997C-AD0236FD8824">
var bbb =
aa.GetVersion();
alert(bbb);
OCX工程class view视图右键add
method,特别注意返回值,要把out与retval都选择上,我就是没选择retval导致页面alert时总是undefined。如果忘记加retval则修改.idl文件
[id(2)] HRESULT GetVersion([out,retval]
BSTR* version);
Vc工程cpp文件方法如下
STDMETHODIMP CRemtCardCtrl::GetVersion(BSTR*
version)
{
*version
= SysAllocString(OLESTR("Hello你好啊!"));
SysFreeString(*version);
::MessageBox(NULL,
"-------", "error", MB_ICONERROR);
return
S_OK;
}
如果ocx再调用dll则加入
char szDllFile[MAX_PATH 1];
sprintf(szDllFile, "D:\\ocx\\12.dll");
HINSTANCE g_hinstLib
= LoadLibrary(szDllFile);
typedef int (WINAPI *
OPSClient)(char*);
OPSClient aaa;
aaa = (OPSClient)
GetProcAddress(g_hinstLib, "GetDllVersion 此处为DLL方法名");
这点东西从周二下午搞到周五下午实在不应该,PS周二下午装了VS2010装了一下午。
总结下,浪费时间最久的是regsvr32注册不好用,必须管理员权限,然后之前用MFC
ACTIVEX的工程,不知道哪个是CLASSID,又去注册表查ID,查出来ID又不对(原因,得多查下,查出带有VERSION跟什么来着,总之很多的KEY
VALUE那个ID才是)。接着是返回值问题,总也取不到值,为了试验好不好用,加入了::MessageBox(NULL,
"aaaaaa",
"error", MB_ICONERROR);
页面有影响,但就是没返回值。
做了3年半的VC,之后2年没做,结果就忘记怎么创建工程了~~哎无语~