VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: download

[原创] 全球首创? 再次突破VB极限!VB真正稳定多线程(不用tlb,tls,ax,pcode)

  [复制链接]
发表于 2010-5-1 23:39:58 | 显示全部楼层
86# msflexgrid  

你老老实实用SDK不就行了么,反正MFC的封装也是浅层的……
acme_pjz 发表于 2010-5-1 23:25

因为用VB搞的工程 太大,编 译太慢了。。。以前还觉得VB编 译快。
现在每编 译一次几百个文件就要很久(现在才想起VC的好,想编 译那个就编 译哪个,再链接就行了。)

VB总是傻傻的从头再编 译一遍,哪怕没改半个字节……


用SDK搞大的项目就像用汇编一样(苦力+累人),没有OOP的爽快感……
回复 支持 反对

使用道具 举报

发表于 2010-5-1 23:42:23 | 显示全部楼层
发一个以前我用VC6 SDK写的东西,MyGVM,文曲星下Lava虚拟机的解释器,因为用VB写的Bug太多,运行得有点慢,而且不支持多线程,所以用VC6写了个……我以前发在文曲星论坛上面的,不知道这个网址还能不能下载:http:/ ...
acme_pjz 发表于 2010-5-1 23:27

您无权进行当前操作,这可能因以下原因之一造成
您所在的用户组(游客)无法进行此操作。
您还没有登录,请填写下面的登录表单后再尝试访问。

------------------------
PS:SDK我也会……只是觉得麻烦……

评分

参与人数 1人气 +1 收起 理由
acme_pjz + 1 参看90楼,有个镜像……

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2010-5-1 23:42:42 | 显示全部楼层
VB总是傻傻的从头再编 译一遍,哪怕没改半个字节……
这个……我不是说过我有个程序貌似解决了这个问题的一半么(这个我好像发到坛子上了吧?)……还有另一半就要改vba6.dll的某些内容了,既然你要用到,你就可以研究一下……
回复 支持 反对

使用道具 举报

发表于 2010-5-1 23:50:34 | 显示全部楼层
这个……我不是说过我有个程序貌似解决了这个问题的一半么(这个我好像发到坛子上了吧?)……还有另一半就要改vba6.dll的某些内容了,既然你要用到,你就可以研究一下……
acme_pjz 发表于 2010-5-1 23:42

你那个增量编译?

己决定要学VC了……VB的事情暂时不再深入研究了……

谁要是有空想全球首创的话可以改进下:
1.PATCH那个IDE设置图标支持真彩色(原始好像只支持256)估计要改检则函数,跳过去
2.PATCH那个VBVM支持UNICODE……估计要改CreateWindowA ->W 以及一序列相关函数……
3.PATCH那个VBA实现单一文件编译,……
其它大家自行补充吧……
回复 支持 反对

使用道具 举报

发表于 2010-5-1 23:56:13 | 显示全部楼层
94# msflexgrid

对呀,不过也就是把以前编译好的obj给自动翻出来而已你不是说vba6.dll在进程里面就对源代码编译一次变成伪代码么……现在就要在那个那里加判断语句了……
回复 支持 反对

使用道具 举报

发表于 2010-5-2 08:10:18 | 显示全部楼层
94# msflexgrid  

对呀,不过也就是把以前编译好的obj给自动翻出来而已你不是说vba6.dll在进程里面就对源代码编译一次变成伪代码么……现在就要在那个那里加判断语句了……
acme_pjz 发表于 2010-5-1 23:56

好像离题 了……那就再离远一点吧:昨天搞那个InPrivate结果我追了IE后发现他是用第250号函数(无文档+未公开+无函数名,又是全球首创?)弹出InPrivate,于是学IE用他的隐藏函数iframe.dll中的第250号结果弹出另外的IE InPrivate,不是内置WEB实现InPrivate晕死了
回复 支持 反对

使用道具 举报

发表于 2010-5-2 10:56:27 | 显示全部楼层
超级牛贴啊 一定要试试
回复 支持 反对

使用道具 举报

发表于 2010-5-2 22:12:35 | 显示全部楼层
中止线程,应使用信号灯让其自然退出,用TerminateThread太过粗暴,虽然线程退出,但线程所占用的内存资源并不会释放出来。
回复 支持 反对

使用道具 举报

发表于 2010-5-3 19:45:07 | 显示全部楼层
83# download

1. I am from Slovakia, I am not speaking Chinese ;)
2. Some sample code is attached .. I use tlb, but for this sample I mix you code (CreateIExpObject) with DLLGetClassObject code, see attachement
3. no, is not registered on mars ... see COINIT_MULTITHREADED and CoInitializeEx and then CoRegistreClassObject

... I mean, the fakeheader is one of posible way to "bypas" DLLGetClassObject, vbheader is something like IStreamed data from which is new class constructed. But this way need more investigation ;) Maybe another way (I see it in one of multithreading library) to multithreading is to using EbLoadRuntime, search on Google for some samples (FreeThreader  uses this technique, I mean). Good luck ;) izero

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2010-5-3 22:16:24 | 显示全部楼层
看的不是很明白 试了一下 但是看到DLLGetClassObject我似乎又找到了一点希望
VBAdvanced这个插件 可以生成一个供C语言调用的dll(dll里面可以使用窗体等东西) 在里面有这么一些初始化代码 如果我们把这些东西搬到多线程函数里面 不知道能不能解决多线程初始化问题?
  1. Option Explicit

  2. Private Const cDelegateASM As Currency = -368956918007638.6215@

  3. Private m_DelegateASM      As Currency

  4. Private Type DelegatorVTables

  5.         VTable(7) As Long

  6. End Type

  7. Private m_VTables       As DelegatorVTables

  8. Private m_pVTableOKQI   As Long

  9. Private m_pVTableFailQI As Long

  10. Public Type FunctionDelegator

  11.         pVTable As Long
  12.         pfn As Long

  13. End Type

  14. Private moInitObject As CRuntimeInit

  15. Public Sub RuntimeInitialize(ByVal hMod As Long)
  16.    
  17.         Dim sFile            As String

  18.         Dim lLen             As Long

  19.         Dim lRet             As Long

  20.         Dim i                As Long

  21.         Dim lpTypeLib        As Long

  22.         Dim TLI              As ITypeLib

  23.         Dim lppTypeInfo      As Long

  24.         Dim TI               As ITypeInfo

  25.         Dim sName            As String

  26.         Dim pAttr            As Long

  27.         Dim TA               As TYPEATTR

  28.         Dim IID_ClassFactory As VBGUID

  29.         Dim IID_IUnknown     As VBGUID

  30.         Dim pGetClass        As Long

  31.         Dim pCall            As ICallDLLGetClassObject

  32.         Dim FD               As FunctionDelegator

  33.         Dim pICF             As IClassFactory

  34.         Dim pUnk             As IUnknown
  35.         
  36.         If GetModuleHandle("VBA6.DLL") <> 0 Then Exit Sub
  37.         If GetModuleHandle("VBA5.DLL") <> 0 Then Exit Sub
  38.    
  39.         sFile = Space$(260)
  40.         lLen = Len(sFile)
  41.         lRet = GetModuleFileName(hMod, sFile, lLen)

  42.         If lRet Then
  43.                 sFile = Left$(sFile, lLen - 1)
  44.                 lpTypeLib = LoadTypeLibEx(sFile, REGKIND_NONE)
  45.                 CopyMemory TLI, lpTypeLib, 4

  46.                 For i = 0 To TLI.GetTypeInfoCount - 1

  47.                         If TLI.GetTypeInfoType(i) = TKIND_COCLASS Then
  48.                                 lppTypeInfo = TLI.GetTypeInfo(i)
  49.                                 CopyMemory TI, lppTypeInfo, 4
  50.                                 TI.GetDocumentation DISPID_UNKNOWN, sName, "", 0, ""

  51.                                 If lstrcmp(sName, "CRuntimeInit") = 0 Then
  52.                                         pAttr = TI.GetTypeAttr
  53.                                         CopyMemory TA, ByVal pAttr, Len(TA)
  54.                                         TI.ReleaseTypeAttr pAttr

  55.                                         If TA.wTypeFlags Then

  56.                                                 Exit For

  57.                                         End If
  58.                                 End If
  59.                         End If

  60.                 Next i

  61.                 With IID_ClassFactory
  62.                         .Data1 = 1
  63.                         .Data4(0) = &HC0
  64.                         .Data4(7) = &H46
  65.                 End With

  66.                 With IID_IUnknown
  67.                         .Data4(0) = &HC0
  68.                         .Data4(7) = &H46
  69.                 End With

  70.                 pGetClass = GetProcAddress(hMod, "DllGetClassObject")

  71.                 If pGetClass Then
  72.                         CopyMemory pCall, InitDelegator(FD, pGetClass), 4
  73.                         lRet = pCall.Call(TA.iid, IID_ClassFactory, pICF)

  74.                         If lRet <> CLASS_E_CLASSNOTAVAILABLE Then
  75.                                 lRet = pICF.CreateInstance(0&, IID_IUnknown, pUnk)

  76.                                 If lRet = S_OK Then
  77.                                         Set moInitObject = pUnk
  78.                                         moInitObject.InitVBCall
  79.                                         CopyMemory pCall, 0&, 4
  80.                                         Set pICF = Nothing
  81.                                         Set pUnk = Nothing
  82.                                 End If
  83.                         End If
  84.                 End If
  85.         End If

  86. End Sub

  87. Public Function InitDelegator(Delegator As FunctionDelegator, Optional ByVal pfn As Long) As IUnknown

  88.         If m_pVTableOKQI = 0 Then InitVTables

  89.         With Delegator
  90.                 .pVTable = m_pVTableOKQI
  91.                 .pfn = pfn
  92.         End With

  93.         CopyMemory InitDelegator, VarPtr(Delegator), 4
  94. End Function

  95. Private Sub InitVTables()

  96.         Dim pAddRefRelease As Long

  97.         With m_VTables
  98.                 .VTable(0) = FuncAddr(AddressOf QueryInterfaceOK)
  99.                 .VTable(4) = FuncAddr(AddressOf QueryInterfaceFail)
  100.                 pAddRefRelease = FuncAddr(AddressOf AddRefRelease)
  101.                 .VTable(1) = pAddRefRelease
  102.                 .VTable(5) = pAddRefRelease
  103.                 .VTable(2) = pAddRefRelease
  104.                 .VTable(6) = pAddRefRelease
  105.                 m_DelegateASM = cDelegateASM
  106.                 .VTable(3) = VarPtr(m_DelegateASM)
  107.                 .VTable(7) = .VTable(3)
  108.                 m_pVTableOKQI = VarPtr(.VTable(0))
  109.                 m_pVTableFailQI = VarPtr(.VTable(4))
  110.         End With

  111. End Sub

  112. Private Function QueryInterfaceOK(This As FunctionDelegator, riid As Long, pvObj As Long) As Long
  113.         pvObj = VarPtr(This)
  114.         This.pVTable = m_pVTableFailQI
  115. End Function

  116. Private Function AddRefRelease(ByVal This As Long) As Long
  117. End Function

  118. Private Function QueryInterfaceFail(ByVal This As Long, riid As Long, pvObj As Long) As Long
  119.         pvObj = 0
  120.         QueryInterfaceFail = E_NOINTERFACE
  121. End Function

  122. Private Function FuncAddr(ByVal pfn As Long) As Long
  123.         FuncAddr = pfn
  124. End Function
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-8-14 09:26

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表