win7 64位与win7 32位或winxp开发程序中调用外部dll之差别

时间:2020-12-05 03:59:43
win 7 64位系统下,pb9开发环境调用外部dll时,没有找到target所在目录下的dll文件,必须把文件复制到windows\SysWOW64下,或者是把dll文件统一放在某一目录下,然后将此目录加入到path路径下,这样有一个问题,如果开发环境调用外部dll比较多,把dll文件复制到系统目录下会造成比较混乱,如果不同程序调用的dll文件同名,但版本不同,问题就无法解决(需要把当前开发程序的dll文件复制过去覆盖同名的文件,相当麻烦),,,是不是可以通过设置参数或修改注册表的方式,改变win 7 64位下pb9运行环境的dll查找路径的过程或顺序,,, 当然,此问题不限pb9开发环境,相信其他环境也是一样的,,,

10 个解决方案

#1


dll 加载,分为静态加载和动态加载;动态加载的模块名又分为是否带路径,静态加载是不带路径的。带路径的就不说了;不带路径,对模块文件有个搜索顺序的,这个顺序不会变,msdn 的说法依次为:
1. 应用程序所在目录
2. 当前目录。程序不一定都是从其所在目录启动的,在“快捷方式”里就有设置启动目录,其即为这里的当前目录
3. 系统目录,对 64 位程序即为 SysWOW64 ,对 32 位程序为 System32 。是对程序而言,不是对系统。
4. Windows 目录
5. path 系统变量所指定的目录
所以,自己单独使用的 dll,和应用程序放在一起比较合适;会被其它共用到的,放到系统目录下更好。

#2


xp下原来都是放在开发环境文件的当前目录下的,一直可用,用win7 64bit,程序刚启动时也可用,运行几次后就不行了,郁闷啊,,,

#3


运行几次后就不行了,具体什么意思、什么表现?是一次开机后刚开始可以,程序运行会儿就不行了,还是程序关闭后再打开就不行了,还是前几次开机运行都可以,后来就再不行了?不行的话,什么提示和反应?应该是程序本身有问题吧,和其所在目录没有关系的。

#4


就是在开发环境下修改代码,然后运行,这样弄几次就不行了,必须关闭程序再次打开才行,win7 64bit下Program Files (x86)目录是不是有什么特殊的含义啊,好像开发环境安装时,选择安装在这个目录下就可以,但其他功能就不行了,比如oracle 10g接口就不能装在这个下面,否则无法连接db,,,

#5


Program Files (x86) 这个目录从名字也可以看出来是系统缺省的用来存放 32 位类软件的,当然了软件设计得当的话,其运行应该不受软件安装位置的影响。
你说不行,无法连接db 什么的,具体信息又不给,怎么判定问题的可能呢?比如说不行,怎么个不行法,你那 dll 是动态还是静态的,动态的话 LoadLibrary() 出错后 GetLastError() 下看看返回什么错误代码,表明什么意思;静态的,系统应该有提示吧,什么信息,或者暂改动态法看看以便更灵活掌握信息。

用的什么开发环境和工具,还是到专门的相应的板块去吧;这里毕竟只是系统应用层面上的板块,而非程序设计方面的。

#6


用pb啊,静态定义调用的吧,不能连续接oracle,问题报错和pl sql developer连续oracle时一样,

#7


pl sql developer安装在带Program Files (x86)目录下也不能连oracle

#8


怎么就找不到合理的答案呢。

#9


Program Files (x86) 问题出在这里,不知道是否是pb的bug还是什么原因,()是不能作为路径的。

#10


问题在于我现在没把pb安装在 Program Files (x86) 目录下面,还是不能用啊,程序不能在当前目录下面找到调用的dll文件,必须复制dll文件到c:\windows\SysWOW64目录下面,或者在path中设置路径指向调用dll文件所在的目录才行啊,,,

#1


dll 加载,分为静态加载和动态加载;动态加载的模块名又分为是否带路径,静态加载是不带路径的。带路径的就不说了;不带路径,对模块文件有个搜索顺序的,这个顺序不会变,msdn 的说法依次为:
1. 应用程序所在目录
2. 当前目录。程序不一定都是从其所在目录启动的,在“快捷方式”里就有设置启动目录,其即为这里的当前目录
3. 系统目录,对 64 位程序即为 SysWOW64 ,对 32 位程序为 System32 。是对程序而言,不是对系统。
4. Windows 目录
5. path 系统变量所指定的目录
所以,自己单独使用的 dll,和应用程序放在一起比较合适;会被其它共用到的,放到系统目录下更好。

#2


xp下原来都是放在开发环境文件的当前目录下的,一直可用,用win7 64bit,程序刚启动时也可用,运行几次后就不行了,郁闷啊,,,

#3


运行几次后就不行了,具体什么意思、什么表现?是一次开机后刚开始可以,程序运行会儿就不行了,还是程序关闭后再打开就不行了,还是前几次开机运行都可以,后来就再不行了?不行的话,什么提示和反应?应该是程序本身有问题吧,和其所在目录没有关系的。

#4


就是在开发环境下修改代码,然后运行,这样弄几次就不行了,必须关闭程序再次打开才行,win7 64bit下Program Files (x86)目录是不是有什么特殊的含义啊,好像开发环境安装时,选择安装在这个目录下就可以,但其他功能就不行了,比如oracle 10g接口就不能装在这个下面,否则无法连接db,,,

#5


Program Files (x86) 这个目录从名字也可以看出来是系统缺省的用来存放 32 位类软件的,当然了软件设计得当的话,其运行应该不受软件安装位置的影响。
你说不行,无法连接db 什么的,具体信息又不给,怎么判定问题的可能呢?比如说不行,怎么个不行法,你那 dll 是动态还是静态的,动态的话 LoadLibrary() 出错后 GetLastError() 下看看返回什么错误代码,表明什么意思;静态的,系统应该有提示吧,什么信息,或者暂改动态法看看以便更灵活掌握信息。

用的什么开发环境和工具,还是到专门的相应的板块去吧;这里毕竟只是系统应用层面上的板块,而非程序设计方面的。

#6


用pb啊,静态定义调用的吧,不能连续接oracle,问题报错和pl sql developer连续oracle时一样,

#7


pl sql developer安装在带Program Files (x86)目录下也不能连oracle

#8


怎么就找不到合理的答案呢。

#9


Program Files (x86) 问题出在这里,不知道是否是pb的bug还是什么原因,()是不能作为路径的。

#10


问题在于我现在没把pb安装在 Program Files (x86) 目录下面,还是不能用啊,程序不能在当前目录下面找到调用的dll文件,必须复制dll文件到c:\windows\SysWOW64目录下面,或者在path中设置路径指向调用dll文件所在的目录才行啊,,,