高分求教:只知道ocx存放的地点(full path), 怎么创建对象?

smilemac 2005-05-06 11:47:54
rt
...全文
271 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzwjt 2005-05-09
  • 打赏
  • 举报
回复
如何注册控件?直接在系统注册表中注册还是在程序中用代码注册?
Frank123 2005-05-08
  • 打赏
  • 举报
回复
请使用这个工具查看OCX的定义(IDL)
vc->tools->ole/com object viewer
打开工具后采单file->view typelib... 选择你的ocx 会生成IDL,在那里面你可以轻松找到你的CLSID和PorgID
smilemac 2005-05-08
  • 打赏
  • 举报
回复
我用“project->Add to project->Componends and Controls”的方式使用我的控件没有问题。但如果动态加载就有问题,我的主程序是一个Console程序,没有窗口,会不会有问题呢?
jerry 2005-05-07
  • 打赏
  • 举报
回复
要使用 OCX控件要么要知道它的 CLSID 要么就是 PorgID

只知道 OCX 文件,你怎么知道是什么控件? 再说这样的控件怎么用?

用#import 引入试试,就能知道它的 CLSID 了

反正你在写程序的时候得知道,不然没办法编译,除非动态创建.

smilemac 2005-05-07
  • 打赏
  • 举报
回复
但是需求是不知道ocx的CLSID和ProgID,只知道在哪里放着。请问怎么办?需要遍历所有注册的控件吗?
Kudeet 2005-05-07
  • 打赏
  • 举报
回复
regsvr32 /s c:\***.ocx
注册控件后,在注册表里HKEY_CLASSES_ROOT会写入相关的信息,你仔细看看变化。


GOOD LUCK
jerry 2005-05-07
  • 打赏
  • 举报
回复
不用知道OCX放在哪里.OCX使用前都要注册的,注册好了就行了,可以加载进来了
HNET 2005-05-07
  • 打赏
  • 举报
回复
regsvr32 ocx_path
初始化com库后,就可以queryinterface了
xjjyx 2005-05-07
  • 打赏
  • 举报
回复
#include <objbase.h>


好像还要引入ole32.dll
smilemac 2005-05-07
  • 打赏
  • 举报
回复
加了也不行.而且我找了个MSDN里的sample client 程序,访问它自己的ocx没问题,但将CLSID和接口GUID换成我的ocx的,马上出现同样错误, "memory access violation, 试图访问0x0000005(有时是别的值)". 但我的ocx我用test container检查过,没问题啊.
jerry 2005-05-07
  • 打赏
  • 举报
回复
AfxEnableControlContainer ();

调用了吗?
smilemac 2005-05-07
  • 打赏
  • 举报
回复
老大,帮我看看我的控件函数为什么不能访问?谢谢了.
sinall 2005-05-07
  • 打赏
  • 举报
回复
你根本就不需要知道ocx的路径,因为,这正是com技术所要解决的一个问题。
当然“只知道ocx存放的地点(full path)”我想这是不可能的。起码你知道它是干什么的吧?
不过不知道也无所谓。
VC或者VB等工具可以读取注册表,然后将系统内注册在注册表中的组件列出来。
即:“注册表项->GUID->文件路径”就可以找到ocx了。

那么你可以选择“project->Add to project->Componends and Controls”来找到并使用它。
xjjyx 2005-05-07
  • 打赏
  • 举报
回复
我只能想到以下的地步,
因为ocx文件都有一个DllRegisterServer的导出文件,用LoadLibraryEx引入ocx,再用GetProcAddress得到DllRegisterServer的地址,再通过地址调用这个文件,就注册了组件,再用得到DllGetClassObject的地址,然后,用别的方法得到 CLSID什么的数据,用DllGetClassObject得到接口,再调用接口,下面是一些示例代码。不能拿来就用。至于ocx文件有没有枚举接口的功能,只能找文件的详细资料了。


HINSTANCE hLib = LoadLibraryEx(pszDllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);

(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);

(*lpDllEntryPoint)();
smilemac 2005-05-07
  • 打赏
  • 举报
回复
哪位高手帮一下忙.谢谢了
smilemac 2005-05-07
  • 打赏
  • 举报
回复
跟进去后,看到是这一句出的问题
STDMETHODIMP COleDispatchImpl::GetTypeInfoCount(UINT* pctinfo)
{
METHOD_PROLOGUE_EX_(CCmdTarget, Dispatch)
*pctinfo = pThis->GetTypeInfoCount();//**********************
return S_OK;
}














































smilemac 2005-05-07
  • 打赏
  • 举报
回复
这是客户端代码,每次到了调用Test函数的时候,就弹出“试图访问不可访问的内存,程序退出”。

控件检查用test container检查过没看出有什么不对的地方.其实那个控件很简单,就是直接用VC6.0的ActiveX Wizard生成的,然后加了一个method,里面什么都不作.

CLSID clsid;

HRESULT hr = CLSIDFromProgID(T2COLE("TESTOCX3.TestOcx3Ctrl.1"), &clsid);

const IID IID_IX3 =
{ 0x60528975, 0xD388, 0x477F,
{ 0xB9, 0x82, 0x11, 0x60, 0xCE, 0x97, 0x05, 0x08 } };

hr = ::CoCreateInstance(clsid,
NULL,
CLSCTX_INPROC_SERVER,
IID_IX3,
(void**)&pIX) ;
if (SUCCEEDED(hr))
{
trace("Succeeded creating component.") ;
pIX->Test() ; //*********************************
//试图访问不可访问的内存,程序退出

pIX->Release() ;
}

















jerry 2005-05-07
  • 打赏
  • 举报
回复
请先确定你的控件的没有问题? 这个可以通过 ActiveX Container 来测试一下
smilemac 2005-05-07
  • 打赏
  • 举报
回复
动态创建是指什么?

另外有一个救命的问题请教,就是我的程序可以成功query出接口的指针,但只要一调用它里面的函数就会产生一个异常。我的控件没问题,用静态的方法直接insert到程序里试过。请问可能是什么问题?
greenabc 2005-05-07
  • 打赏
  • 举报
回复
project->Add to project->Componends and Controls
弹出对话框中双击“Registered ActiveX Controls”
然后在这个文件夹中找到你要加的对象(前提是你已经注册了ocx),选中->点击 “Insert”
然后,看者提示,一步一步做,相信你能够使用了。


3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧