| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 382 人关注过本帖
标题:我自己编译的dll,在vfp环境里可以使用,但是脱离vfp后提示“找不到DLL类定 ...
只看楼主 加入收藏
unnu
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-4-3
结帖率:0
  已结贴   问题点数:20  回复次数:11   
我自己编译的dll,在vfp环境里可以使用,但是脱离vfp后提示“找不到DLL类定义”
一、开发环境:win7环境编程,vfp版本是sp2.
二、运行环境:msvcr71.dll、vfp9r.dll、vfp9rchs.dll、vfp9t.dll、GdiPlus.dll 已一同发布
三、测试环境:win7、xp 共5台电脑
四、测试过程:
             1.win7开发环境内可以直接运行。
             2.同一台win7电脑非vfp环境带运行库,需手动注册才能运行。编写的bat文件可以正常注册运行。
             3.换其他电脑,xp环境,安装过vfp的可以通过cmd注册成功。
             4.xp环境,没安装过vfp的反复提示注册不成功。
             5.电脑系统不同,但是提示错误都是注册不成功!
             6.网上的解决方案基本试遍了!

五、提示错误:“找不到DLL类定义”。

六、代码部分:
1.dll中定义类:DEFINE CLASS MainDll AS Session OLEPUBLIC
2.EXE调用dll:
             sFilePath='mydll.dll'
             RUN /n regsvr32 /s (sFilePath) &&这里就是注册,但是不成功!
3.cmd手动注册代码:regsvr32 mydll.dll
4.bat批处理注册代码:regsvr32 %~dp0mydll.dll
5.mydll简易实例代码:
DEFINE CLASS MainDll AS Session OLEPUBLIC

*!*    只是做了简易实例,为了说明相关问题

    PROCEDURE shili
    LPARAMETERS sOriginalValue,nFlag

    DO case
    CASE nFlag==1
        ?'简易实例1:',sOriginalValue
    CASE nFlag==2
        ?'简易实例2:',sOriginalValue
    ENDCASE

    ENDPROC

*!*    下面有调用自身 MainDll 的命令,但是应该不是这个问题也做省略!

ENDDEFINE

6.附上文连编dll,已上传。
mydll1.dll:是单线程连编的
mydll2.dll:是多线程连编的


七、错误提示如下图:


八、灵异事件:
1.开始不能注册的电脑都能注册dll了。(试的方式比较多,怎么成功的我也蒙!)。
2.如果安装目录是“abc\”,把安装目录名改为“abcd\”,也就是更改了安装目录名。然后右键dll注册,还是能注册,但是运行EXE后,却找不到dll里的控件对象。(备注:dll文件就在安装目录里!)
3.即使反注册后再注册也不行!

九、求解决方案

谢谢!

[此贴子已经被作者于2019-1-9 17:24编辑过]

附件: 您没有浏览附件的权限,请 登录注册
2019-01-07 16:25
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:172
帖 子:6436
专家分:28366
注 册:2014-5-20
  得分:7 
VFP写的DLL是COM服务应用,要在操作系统注册才能使用。
2019-01-07 20:16
unnu
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-4-3
  得分:0 
回复 2楼 吹水佬
上面的代码就是注册代码。但是也不行。
我是win7环境编程,vfp版本是sp2.
我在win7电脑上写bat都可以注册成功。但是换了xp或者其他电脑后,cmd注册都不行!
2019-01-07 20:25
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:172
帖 子:6436
专家分:28366
注 册:2014-5-20
  得分:0 
最好能提供mydll.dll文件测试,或者随便写个简单的mydll.dll试试。
也可以用VFP写注册过程,示例:
** test.prg
IF !_RegServer("mydll.MainDll", 0)
    IF !_RegServer("mydll.dll", 1)
        ? "注册失败"
        RETURN
    ENDIF
ENDIF
? "注册成功"
RETURN

FUNCTION _RegServer(szName, ddFlags)
    IF INLIST(ddFlags, 1, 2) AND !FILE(szName)
        MESSAGEBOX(szName + " 文件不存在")
        RETURN .F.
    ENDIF
    LOCAL szCLSID, ddRet
    DO CASE
        * 检测COM服务是否已注册, szName为COM服务对象名
    CASE ddFlags == 0
        DECLARE LONG CLSIDFromProgID IN Ole32 STRING@, STRING@
        szCLSID = REPLICATE(0h00, 16)
        ddRet = CLSIDFromProgID(STRCONV(szName + 0h00, 5), @szCLSID)
        CLEAR DLLS "CLSIDFromProgID"
        RETURN (ddRet == 0)
        * 注册COM服务, szName为COM服务文件名
    CASE ddFlags == 1
        DECLARE LONG DllRegisterServer IN (szName)
        ddRet = DllRegisterServer()
        CLEAR DLLS "DllRegisterServer"
        * 卸载COM服务, szName为COM服务文件名
    CASE ddFlags == 2
        DECLARE LONG DllUnregisterServer IN (szName)
        ddRet = DllUnregisterServer()
        CLEAR DLLS "DllUnregisterServer"
    OTHERWISE
        MESSAGEBOX("调用_RegServer()的参数无效")
        RETURN .F.
    ENDCASE
    IF (ddRet != 0)
        MESSAGEBOX("调用_RegServer()失败,试用管理员身份运行。")
    ENDIF
    RETURN (ddRet == 0)
ENDFUNC
2019-01-08 04:55
unnu
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-4-3
  得分:0 
回复 4楼 吹水佬
老哥,还是不行,用您的代码提示是“调用_RegServer()失败,试用管理员身份运行。”。
现上传DLL简洁事例说明。

mydll.dll中的简易事例代码如下:
DEFINE CLASS MainDll AS Session OLEPUBLIC

*!*    只是做了简易实例,为了说明相关问题

    PROCEDURE shili
    LPARAMETERS sOriginalValue,nFlag

    DO case
    CASE nFlag==1
        ?'简易实例1:',sOriginalValue
    CASE nFlag==2
        ?'简易实例2:',sOriginalValue
    ENDCASE

    ENDPROC

*!*    下面有调用自身 MainDll 的命令,但是应该不是这个问题也做省略!

ENDDEFINE

同时将上述代码连编成dll,同时在附件中已经上传。
mydll1.dll:是单线程连编的
mydll2.dll:是多线程连编的


[此贴子已经被作者于2019-1-8 10:16编辑过]

附件: 您没有浏览附件的权限,请 登录注册
2019-01-08 10:08
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:172
帖 子:6436
专家分:28366
注 册:2014-5-20
  得分:0 
试了一下,dll文件没问题,只是不能在DLL用?号输出。
注册不成功可能是系统有限制,如管理员权限、一些防XX的限制,最好先排除这类限制再去注册。
2019-01-08 11:17
unnu
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-4-3
  得分:0 
回复 6楼 吹水佬
老哥,DLL里面的问号就是做个演示,真实的代码里没有问号。
如果您说没问题的话,那我就基本绝望了。
因为网上的所有方案,我基本试遍了!

2019-01-08 11:33
厨师王德榜
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:72
帖 子:460
专家分:1676
注 册:2013-2-16
  得分:7 
专门找了一台XP的电脑来试,这台电脑上有VFP9.0环境。
一个能注册上,另一个不能。供你参考吧。感觉是不是DLL本身的代码还有些问题。

附件: 您没有浏览附件的权限,请 登录注册
2019-01-08 15:11
unnu
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-4-3
  得分:0 
回复 8楼 厨师王德榜
要是dll编写的有问题的话,也不应该有的电脑可以,有的电脑不行的情况呀。
并且开始不行的电脑,不知道怎么弄的,后来又都可以注册了。但是过程很麻烦。有时候还是蒙对了。

是不是和vfp的版本有关系呀?
我用的是vfp9  sp2的版本
是不是这个版本存在问题?

老哥您是用什么版本,什么开发和测试环境来做dll的?
2019-01-08 21:53
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:172
帖 子:6436
专家分:28366
注 册:2014-5-20
  得分:0 
在Win10 64位专业版测试,要用管理权限登录和管理身份运行注册。
只是个别的注册问题,应该与VFP无关,很有可能是受到系统或第三方应用设置的限制。

2019-01-09 04:26







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.065012 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved