activeX DLL 的编译问题

ly012659 2009-03-10 10:08:21
问题描述:
我在一个activeX dll中定义了一个类,将这个类作为其他各个dll与客户程序标志变量的公共载体,全局变量
在类中定义了一个timer 类型的变量g_timer2,以及一个control类型的变量g_MSCOMM,它作为一个对客户程序mscomm控件的引用,在其他dll中以及客户程序中都对该类在主程序中的对象进行了引用.在调试过程中,没有出现问题.
现在对该类进行编译,第一次在编译时选择no compatibility选项,生成gf.dll,二次编译选择binary compatibility选项,这时弹出'g_MSCOMM' in the 'Globalflags'class module has arguments and/or a return type that is incompatible with a similar declaration in the version compatible component.

Original definition:
Public g_MSCOMM As Object

Current definition:
Public g_MSCOMM As Control

Original definition:
Property Set g_MSCOMM(ByVal RHS As Object)

Current definition:
Public g_MSCOMM As Control

然后有两个选项 break compatibility 和 preserve compatibility

g_timer2也会出现同样的提示

我不明白究竟是哪里出了问题,这个向后兼容性究竟应该注意什么?我前后两次程序并没改动什么,g_MSCOMM,g_timer2的定义有问题吗?

Option Explicit
Public Offline As Boolean
Public SendingMsg As Boolean
Public SendAll As Boolean
Public langflag As Integer
Public FinishULData As Boolean
Public Iniflag As Boolean
Public FinishFlag As Boolean
Public PressStop As Boolean

Public Almshow As Boolean
Public SendFile As Boolean
Public AllowMoni As Boolean
Public FinishMoni As Boolean
Public SendPara As Boolean
Public Addr As Integer
Public addrStr1 As String
Public addrRecieve As String
Public ParaTabShow As Boolean

Public TestStyle As Integer
Public SparaExist As Boolean
Public reqTest As Boolean
Public DatAddr03 As String

Public coderight As Boolean
Public coderight1 As Boolean
Public ResumeFlag As Boolean
Public fftFlag As Boolean

Public message As String
Public AdjFlag As Integer
Public ServoType As String
Public TimerCount As Integer

Public g_MSCOMM As Control
Public g_Timer2 As Timer


Public MDIhwnd As Long
Public SpecialShow As Boolean
Public PhaseShow As Boolean
Public OperationShow As Boolean
Public LoadingShow As Boolean
Public JOGShow As Boolean
Public InertiaShow As Boolean
Public HandShow As Boolean
Public DMShow As Boolean
Public IMShow As Boolean
Public ScopeShow As Boolean

Public fftCmdShow As Boolean
Public fftGraphicShow As Boolean
Public testCmdShow As Boolean
Public testGraphicShow As Boolean
Public testParaShow As Boolean

Public Cn As ADODB.Connection

Public Function ProcessContinue(ByVal hwnd As Long) As Boolean
If Not FinishULData Then
If Not PressStop Then
ProcessContinue = False
MessageBoxEx hwnd, "UpLoad Plot Data", , MB_OK Or MB_ICONINFORMATION, LANG_ENGLISH
Exit Function
End If
End If

If SendPara Then
ProcessContinue = False
MessageBoxEx hwnd, "SendPara", ,MB_OK Or MB_ICONINFORMATION, LANG_ENGLISH
Exit Function
End If

If fftFlag Then
ProcessContinue = False
MessageBoxEx hwnd, "fftFlag", , MB_OK Or MB_ICONINFORMATION, LANG_ENGLISH
Exit Function
End If


ProcessContinue = True

End Function

Public Sub SendingMessage(ByVal msg As String)

Dim Out1() As Byte
Dim Lrc As Long
Dim a As Integer
Dim L As Integer

SendingMsg = True

msg = addrStr1 & msg
L = Len(msg)
Dim i As Integer
Lrc = 0

For i = 0 To L / 2 - 1
a = Val("&H" & Mid(msg, 2 * i + 1, 2))
Lrc = a + Lrc
Next

Lrc = Lrc Mod 256
Lrc = 256 - Lrc

If Lrc = 256 Then
Lrc = 0
End If

ReDim Out1(L + 4) As Byte
For i = 1 To L
Out1(i) = Asc(Mid(msg, i, 1))
Next i

If Lrc < 16 Then
Out1(L + 1) = Asc(Mid("0" & Hex(Lrc), 1, 1))
Out1(L + 2) = Asc(Mid("0" & Hex(Lrc), 2, 1))
Else
Out1(L + 1) = Asc(Mid(Hex(Lrc), 1, 1))
Out1(L + 2) = Asc(Mid(Hex(Lrc), 2, 1))
End If

Out1(0) = Asc(":")
Out1(L + 3) = &HD
Out1(L + 4) = &HA

If g_MSCOMM.PortOpen = True Then
g_MSCOMM.OutBufferCount = 0
g_MSCOMM.Output = Out1 '
End If

End Sub

...全文
125 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly012659 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Tiger_Zhao 的回复:]
既然 VB 不支持将 Control 作为参数,那么声明为 Object 或 MSComm 都是可以的。
[/Quote]


'g_MSCOMM' in the 'Globalflags'class module has arguments and/or a return type that is incompatible with a similar declaration in the version compatible component.

Original definition:
Public g_MSCOMM As Object


Current definition:
Public g_MSCOMM As Control

Original definition:
Property Set g_MSCOMM(ByVal RHS As Object)

Current definition:
Public g_MSCOMM As Control

然后有两个选项 break compatibility 和 preserve compatibility

既然可以声明为MSComm ,那为什么编译时会出现上述提示呢(如果声明为object就不会有这些东西出现了~~~) 而且出现
Original definition:
Property Set g_MSCOMM(ByVal RHS As Object) 我根本没有设置属性啊,编译器怎么判断出Original definition的是object类型.这究竟是怎么一种编译机制啊,很瞢~~~


还有to chenjl1031

第一次编译时根本选不了二进制编译(binary compatibility吧)啊,只有在no compatibility模式下编译生成一个gf.dll文件后才能进行二进制编译
authenticationf 2009-03-11
  • 打赏
  • 举报
回复
不懂,up
Tiger_Zhao 2009-03-11
  • 打赏
  • 举报
回复
在 COM 标准中没有公共变量,一个属性通过 {get_XXX, set_XXX, let_XXX} 等方法表示。
VB 自动将公共变量翻译为属性,所以接口中就有 Property Set g_MSCOMM(...)。

具体细节可用 Visual Studio 的工具 OLE View 打开 dll 查看。
ly012659 2009-03-10
  • 打赏
  • 举报
回复
没有人回答吗?
我等~~
东方之珠 2009-03-10
  • 打赏
  • 举报
回复
改成:
Public g_MSCOMM As Variant  
试一试
Tiger_Zhao 2009-03-10
  • 打赏
  • 举报
回复
VB.Control 其实是 VB 内部的一个特殊类,它自动对控件进行封装让它们具有一定的共性。
比如用 MSComm 控件调用下面的函数可以正常工作,但是在其它编程环境中就不会有 .Parent 属性。
Private Sub f(ByVal c As Control)
Debug.Print c.Parent.Name
Debug.Print c.CommPort
End Sub


既然 VB 不支持将 Control 作为参数,那么声明为 Object 或 MSComm 都是可以的。
ly012659 2009-03-10
  • 打赏
  • 举报
回复
现在我将g_MSCOMM g_timer2定义为object重新编译,就没有break compatibility的提示出现了

g_timer2为什么不能定义为timer,g_MSCOMM 定义为control类型呢
将原来的一个类拆分为两个类,public变量分别定义在两个类里边就没有runtime error 7 out of memory 出现了

像这样将许多公共变量装在类中,它的弊端是什么呢
ly012659 2009-03-10
  • 打赏
  • 举报
回复
没人回贴~~~
可怜可怜,大侠们回个贴吧
是我问题叙述的不清楚吗?
ly012659 2009-03-10
  • 打赏
  • 举报
回复
第一次编译时根本就不能选择二进制编译
还有我所有的public变量都是共用的
在与程序调试时没有问题,可是移除activex 工程,直接引用gf.dll时报错
Out of memory (Error 7),难道是我定义的类中的变量太多了?可是这些变量都是要与客户程序共用的啊,实现与客户程序的标志共用
东方之珠 2009-03-10
  • 打赏
  • 举报
回复
编译时选择二进制兼容模式。还有,你那些这是定义,如果不是供外部引用,就改成private。
吸取前辈的经验,自己写了个VB6.0 DLL文件的编译链接插件,按照以下方法,可以在VB 6.0中直接编译生成带外部输出的DLL文件。   1. 把MakeDLL.dll和MakeDLL.exe两个文件复制入VB所在目录,例如   "C:\Program Files\Microsoft Visual Studio\VB98"   2. 把Module1DLL.bas和Standard DLL.vbp两个文件复制入VB所在目录下的   Template目录下的Projects目录,例如   "C:\Program Files\Microsoft Visual Studio\VB98\Template\Projects"   3. 启动VB 6.0,随便选择建立一种什么类型的程序,然后主菜单选择"外接程序"   再选择"外接程序管理器",你应该可以看到在列表中有"Create DLLs in VB 6.0,然后选择它,并在窗口右下方的"加载行为"中把"在启动中加载"和"加载/卸载"都钩选,点确定,再次关闭VB 6.0   4. 再次启动VB,建立一个ActiveX DLL程序,这个时候点主菜单"文件",可以看到"生成工程1.DLL(K)"和"选择DLL出口函数"菜单项目。   好了,大功告成,现在你的VB 6.0已经可以直接编译链接标准的DLL文件了,造作方法,如下:   建立ActiveX dll程序,添加一个模块(DLL的函数只能在模块中才有效),在模块中编写你的DLL function过程函数,编写完毕,点保存,然后点"文件"菜单下的”选择DLL出口函数",在弹出窗口中选择需要申明为可以外部调用的   function,然后确定,最后点"文件"->"生成xxx.dll(K)",编译生成DLL。   需要注意的地方如下:   1. 程序代码必须在模块中编写   2. 需要申明为外部调用的函数必须为Public   3. DLL代码中必须包含一个function DLLmain函数和一个sub Main,不过function DLLmain会被执行,而sub main只是摆设,其中的代码不会运行,但是必须有这个东西(◎_◎)。   4. DLL代码编写没有什么特殊的要求,可以做一切可以在VB中用的东西,比如调用API啊,编写嵌入代码啊(关键)……

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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