ocx调用dll的问题

时间:2022-09-30 15:00:00
写了一个ocx控件,调用了一些dll,有些是注册需要的dll(叫A.dll),但有些是运行ocx需要的dll(B.dll),
现在的问题是,比如C程序调用了ocx控件,我必须把B.dll放到系统目录或者C程序运行目录,
我不想把B.dll放到系统目录,但是问题来了 我现在不知道什么程序会调用我的ocx,也就不知道我的B.dll需要放在哪里,
这个问题怎么解决啊~

12 个解决方案

#1


[.ocx依赖的dll只需要和.ocx放到一起就可以了, 但是B.dll放到ocx的目录下,提示加载B.dll失败,我放到C程序运行目录就可以成功加载,
引用 1 楼 lzlliuzunli 的回复:
.ocx依赖的dll只需要和.ocx放到一起就可以了

但是B.dll放到ocx的目录下,提示加载B.dll失败,我放到C程序运行目录就可以成功加载 , 用Depends看下你的C程序是不是也依赖B.dll了,
引用 4 楼 lzlliuzunli 的回复:
用Depends看下你的C程序是不是也依赖B.dll了

不依赖啊,是ocx在初始化的时候要调用B.dll,但是通过C程序调用ocx时,ocx就会在c程序目录找b.dll, 不科学,ocx依赖应该在ocx目录下找才对,莫非你是用LoadLibrary指定当前进程的相对路径?, 提示你一下,如果你的 C 在远程计算机上,难道你还要放在那个远方的电脑里。
所以最佳的做法是放在系统的目录,包括你的 .ocx 文件都应该放在系统目录里面。
如果你此时实在不想放在系统目录,此时你可以为 OCX 设置你自己的目录,然后在注册表项里面设置绝对路径。
此时你引用的 .dll 如果仅仅是为 OCX 使用的,可以放在你期望放置的任何位置,但是绝对不是 C 所在位置,因为你不知道 C 是谁。
此时最好是像 OCX 那样放在 .dll 所在的目录或者是自己专门的目录。
此时在你的 OCX 加载这个 .dll 时候,使用绝对路径加载。这个绝对路径可以是静态的,也可以是动态的,但是你加载的时候,必须知道她到底在哪里。
如果你不能使用 LoadLibrary 手动加载,而是自动加载,那么使用 SetDllDirectory 设置加载路径。,
引用 6 楼 lzlliuzunli 的回复:
不科学,ocx依赖应该在ocx目录下找才对,莫非你是用LoadLibrary指定当前进程的相对路径?

没有用loadlibrary,自动加载的,其实是用的bcg库的一个风格dll,BCGPStyle2010Blue2210.dll这个dll是在C加载ocx的时候在系统目录或者C的目录下找的,而不是在ocx的目录下找,
引用 7 楼 Saleayas 的回复:
提示你一下,如果你的 C 在远程计算机上,难道你还要放在那个远方的电脑里。
所以最佳的做法是放在系统的目录,包括你的 .ocx 文件都应该放在系统目录里面。
如果你此时实在不想放在系统目录,此时你可以为 OCX 设置你自己的目录,然后在注册表项里面设置绝对路径。
此时你引用的 .dll 如果仅仅是为 OCX 使用的,可以放在你期望放置的任何位置,但是绝对不是 C 所在位置,因为你不知道 C 是谁。
此时最好是像 OCX 那样放在 .dll 所在的目录或者是自己专门的目录。
此时在你的 OCX 加载这个 .dll 时候,使用绝对路径加载。这个绝对路径可以是静态的,也可以是动态的,但是你加载的时候,必须知道她到底在哪里。
如果你不能使用 LoadLibrary 手动加载,而是自动加载,那么使用 SetDllDirectory 设置加载路径。

嗯 就是这样的  我查下怎么设置ocx的dll加载目录, 有个问题,是不是其它程序都是通过你的C运行程序来调用ocx的,还是直接调用OCX。但不管什么方式,只要是你的主进程调用ocx,只要把你的ocx依赖的dll库放到主进程目录下就可以了。, 你要约定啊,你告诉用户需要把dll防止在ocx同目录下,这样在用户的安装包中会按照这个处理的!, 在dllmian开始时设置setdlldirectory试试]

#1


[.ocx依赖的dll只需要和.ocx放到一起就可以了, 但是B.dll放到ocx的目录下,提示加载B.dll失败,我放到C程序运行目录就可以成功加载,
引用 1 楼 lzlliuzunli 的回复:
.ocx依赖的dll只需要和.ocx放到一起就可以了

但是B.dll放到ocx的目录下,提示加载B.dll失败,我放到C程序运行目录就可以成功加载 , 用Depends看下你的C程序是不是也依赖B.dll了,
引用 4 楼 lzlliuzunli 的回复:
用Depends看下你的C程序是不是也依赖B.dll了

不依赖啊,是ocx在初始化的时候要调用B.dll,但是通过C程序调用ocx时,ocx就会在c程序目录找b.dll, 不科学,ocx依赖应该在ocx目录下找才对,莫非你是用LoadLibrary指定当前进程的相对路径?, 提示你一下,如果你的 C 在远程计算机上,难道你还要放在那个远方的电脑里。
所以最佳的做法是放在系统的目录,包括你的 .ocx 文件都应该放在系统目录里面。
如果你此时实在不想放在系统目录,此时你可以为 OCX 设置你自己的目录,然后在注册表项里面设置绝对路径。
此时你引用的 .dll 如果仅仅是为 OCX 使用的,可以放在你期望放置的任何位置,但是绝对不是 C 所在位置,因为你不知道 C 是谁。
此时最好是像 OCX 那样放在 .dll 所在的目录或者是自己专门的目录。
此时在你的 OCX 加载这个 .dll 时候,使用绝对路径加载。这个绝对路径可以是静态的,也可以是动态的,但是你加载的时候,必须知道她到底在哪里。
如果你不能使用 LoadLibrary 手动加载,而是自动加载,那么使用 SetDllDirectory 设置加载路径。,
引用 6 楼 lzlliuzunli 的回复:
不科学,ocx依赖应该在ocx目录下找才对,莫非你是用LoadLibrary指定当前进程的相对路径?

没有用loadlibrary,自动加载的,其实是用的bcg库的一个风格dll,BCGPStyle2010Blue2210.dll这个dll是在C加载ocx的时候在系统目录或者C的目录下找的,而不是在ocx的目录下找,
引用 7 楼 Saleayas 的回复:
提示你一下,如果你的 C 在远程计算机上,难道你还要放在那个远方的电脑里。
所以最佳的做法是放在系统的目录,包括你的 .ocx 文件都应该放在系统目录里面。
如果你此时实在不想放在系统目录,此时你可以为 OCX 设置你自己的目录,然后在注册表项里面设置绝对路径。
此时你引用的 .dll 如果仅仅是为 OCX 使用的,可以放在你期望放置的任何位置,但是绝对不是 C 所在位置,因为你不知道 C 是谁。
此时最好是像 OCX 那样放在 .dll 所在的目录或者是自己专门的目录。
此时在你的 OCX 加载这个 .dll 时候,使用绝对路径加载。这个绝对路径可以是静态的,也可以是动态的,但是你加载的时候,必须知道她到底在哪里。
如果你不能使用 LoadLibrary 手动加载,而是自动加载,那么使用 SetDllDirectory 设置加载路径。

嗯 就是这样的  我查下怎么设置ocx的dll加载目录, 有个问题,是不是其它程序都是通过你的C运行程序来调用ocx的,还是直接调用OCX。但不管什么方式,只要是你的主进程调用ocx,只要把你的ocx依赖的dll库放到主进程目录下就可以了。, 你要约定啊,你告诉用户需要把dll防止在ocx同目录下,这样在用户的安装包中会按照这个处理的!, 在dllmian开始时设置setdlldirectory试试]