C#调用VB6写的ActiveX Dll

搜索了很多资料,下载了Demo:http://download.csdn.net/detail/xieguoxian/2747484然后在同学电脑上测试才弄好...记录下

 

(一)

前期搜索资料:

  VB写好的DLL,在C#里面添加引用,就会有与DLL同名的namespace,vb6的类模块变成interface,但是可以new出来调用,调用就是出错,说是未注册类...

    具体提示是: COM类工厂中CLSID为{......}的组件时失败,原因是出现以下错误:80040154

  于是手动regsvr32 mydll.dll,提示成功,但还是运行就报错...跟上面一样,说是未注册类...

 

再次搜索,下载到最上面的Demo,刚打开运行,就是跟上面报错一样...运行demo中的dll注册就弄好了,demo中的可以运行...

 

这张图是我问题解决后,regsvr32 /u testdll.dll重现错误给弄的

 

 

但是我自己的vb C# code就算是手动注册还是没辙.......郁闷啊

(二)

我尝试引用下载的demo中的DllTest.dll,我new调方法,对于同一个dll,demo中可以运行,我自己新建的不行

问题定位到我的C#项目上来了,于是千找万找,找到下面这不同...

  

  这是demo中的dlltest属性

 

  

  这是我的Winform引用中的Dlltest

 

不同点就是,路径 obj\[x86\]debug\......

一个有demo中的有x86,我的没有,我系统是64位,于是尝试将 项目-生成-目标平台改成x86,皆大欢喜,可以运行了...

 

 

(三)

这个x86 x64 AnyCpu我不太懂什么区别,改完了就可以运行

发现,其实在VS里面不用手动注册,但分发给别人用的时候,记得把dll也带进去,想办法在客户机上注册

 

VB代码

1 Public Function Haha(str As String) As String
2     MsgBox str
3     Haha = "string返回值"
4 End Function

 

C#就一个窗口,一个按钮

        private void button1_Click(object sender, EventArgs e)
        {
            string vbreturn=new MYDll.WoHuiLe().Haha("c#传给VB函数的,在vb里面msgbox");
            MessageBox.Show(vbreturn);
        }

 

弹两次MsgBox,真欢乐...

 

手动注册不方便,去写个小工具吧...

 

转载于:https://www.cnblogs.com/magicdawn/p/csharpcallvbdll.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个 VB6 多线程代码样例: ``` Private Sub Form_Load() Dim Thread1 As New Thread Set Thread1 = New Thread Thread1.ThreadID = 1 Thread1.Run End Sub Private Sub Class_Initialize() Dim Thread2 As New Thread Set Thread2 = New Thread Thread2.ThreadID = 2 Thread2.Run End Sub Private Sub Thread_Run() Dim i As Long For i = 1 To 100 Debug.Print "Thread " & ThreadID & ": " & i Sleep 1000 Next End Sub ``` 这是一个简单的 VB6 多线程程序,它创建了两个线程:一个在 `Form_Load` 事件中创建,另一个在类的初始化中创建。每个线程都在循环中输出其 `ThreadID` 和循环计数器的值,并在每次循环之间使用 `Sleep` 函数暂停一秒。 请注意,由于 VB6 不支持原生多线程,因此上述代码使用类来实现多线程。 ### 回答2: 在VB6中,虽然不支持直接的多线程编程,但可以通过API函数来实现多线程的功能。下面是一个使用VB6的多线程代码示例: 首先,在VB6中创建一个新的标准EXE项目。然后在Form1的代码模块中添加以下代码: ```vb Option Explicit Private Declare Function CreateThread Lib "kernel32" ( _ ByVal lpThreadAttributes As Long, _ ByVal dwStackSize As Long, _ ByVal lpStartAddress As Long, _ ByVal lpParameter As Long, _ ByVal dwCreationFlags As Long, _ lpThreadId As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" ( _ ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) As Long Private Sub Form_Load() Dim hThread As Long Dim dwThreadId As Long ' 创建一个新线程 hThread = CreateThread(ByVal 0&, 0&, AddressOf ThreadProc, ByVal 0&, 0&, dwThreadId) ' 等待线程结束 WaitForSingleObject hThread, INFINITE ' 关闭线程句柄 CloseHandle hThread ' 显示线程结束提示 MsgBox "线程结束" End Sub Private Sub ThreadProc() ' 在这里编多线程的代码逻辑 MsgBox "多线程执行" End Sub ``` 在上面的例子中,我们使用了CreateThread和WaitForSingleObject两个API函数来创建和控制线程。在Form_Load事件中,我们通过调用CreateThread函数创建了一个新的线程,并将线程函数指定为ThreadProc。然后使用WaitForSingleObject函数等待线程结束,保证线程的完整执行。最后,我们通过CloseHandle函数关闭线程句柄,清理资源。在ThreadProc函数中,我们可以编我们需要在新线程中执行的任何代码逻辑。 需要注意的是,由于VB6的单线程限制,无法直接从新线程中访问窗体上的控件,如果需要更新界面的话,可以使用回调函数的方式来通知主线程进行更新。 虽然VB6不是推荐用于多线程编程,但通过API的帮助,我们可以实现简单的多线程功能。 ### 回答3: VB6是一门过时的编程语言,不支持多线程编程。然而,我们可以通过使用ActiveX组件来实现多线程行为。下面是一个简单的VB6多线程代码样例: 首先,我们需要创建一个ActiveX DLL项目。打开VB6,并选择“ActiveX DLL”模板,命名为“MultiThreadDLL”。 在Class1模块中,添加以下代码: ```vb Option Explicit Public Event ThreadCompleted(ByVal result As String) Public Sub StartThread() Dim t As ThreadClass Set t = New ThreadClass Set t.Parent = Me t.StartThread End Sub Public Sub OnThreadCompleted(result As String) RaiseEvent ThreadCompleted(result) End Sub ``` 然后,添加一个标准模块。在模块中添加以下代码: ```vb Option Explicit Dim WithEvents mt As New MultiThreadDLL.Class1 Private Sub mt_ThreadCompleted(ByVal result As String) MsgBox "线程执行完毕,结果为:" & result End Sub Sub StartMultiThread() mt.StartThread End Sub ``` 最后,我们需要创建一个Class模块,命名为“ThreadClass”。在Class模块中添加以下代码: ```vb Option Explicit Public Parent As MultiThreadDLL.Class1 Public Sub StartThread() Dim t As ThreadClass Set t = New ThreadClass t.Parent = Me.Parent Dim result As String '模拟耗时操作 For i = 1 To 100000000 result = result & i Next i Me.Parent.OnThreadCompleted result End Sub ``` 现在,我们可以在标准模块中调用StartMultiThread过程来启动多线程。当线程执行完毕时,会弹出一个消息框显示结果。 需要注意的是,由于VB6不是原生支持多线程编程,所以它的多线程实现仅仅是通过使用ActiveX组件来模拟实现的,并不是真正的多线程。在实际开发中,建议使用支持多线程的现代编程语言,如C#或Java。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值