从 C 调用用 VB6 制作的 DLL

标签 c dll vb6

好吧,这个问题与我苦苦思索的最后一个问题正好相反……我觉得我快要搞定了,但就是行不通。 以前,我试图用 C 编译一个 DLL,然后从 VB 调用它,但我意识到这并不是我真正想要的(我希望程序用 C 编写,同时使用 VB 前端,而不是前端是编程并使用 DLL 的功能)。

现在,我正在用 VB 编译一个 DLL 并尝试从 C .exe 调用它。

“等等,你不能用 VB 编译 DLL!” Actually ,我拦截了 VB6.EXE 对链接器的调用,并为我希望它导出的函数添加了一个定义文件,这是最好的部分——如果我将 dll 复制到 system32,我可以从另一个 VB 程序调用函数并且它工作正常。 唯一的问题是,我似乎无法从 C 加载它。好吧,我可以,而且我得到了句柄,我得到了函数的地址,只是程序失败了。

这是我导出的虚拟函数:

Public Function PopupMessage(ByVal rawr As Integer) As Integer
    Msgbox "HERE BE " & rawr & " DRAGON(S)."
    PopupMessage = 4
End Function

我可以从另一个 VB6 程序中这样调用它:

Public Declare Function PopupMessage Lib "vbdll" _
    (ByVal howmanydragons As Integer) As Integer

Private Sub Command1_Click()
    If IsNumeric(Text1.Text) Then
        Text2.Text = PopupMessage(Text1.Text)
    End If 
End Sub

并且,来自 C:

int main(){
  typedef short int (*vbfun)(short int); //VB6 "Integer" is 16 bits
  vbfun popup_message;
  HANDLE dllhnd;
  dllhnd = LoadLibrary("vbdll.dll");
  if(dllhnd>(void*)HINSTANCE_ERROR){
    popup_message = (vbfun)GetProcAddress(dllhnd, "PopupMessage");
    printf("%d", popup_message(3));
  }
  return 0;
}

当我调试时,我发现我遇到了访问冲突,这在过去意味着我忘记了 VB 函数中的 ByVal,并且它正在传递对 5 或其他内容的引用。但是我在这里看不出任何错误...我从 DLL 中获取了 ProcAddress,它与我从 dumpbin 中获取的偏移量相匹配,我可以从 VB 中调用它,但是 C 调用者遇到了访问冲突...

有什么想法吗?有人看到我忽略的东西吗?我意识到我正在做一些相当晦涩且几乎闻所未闻的事情,而不是仅仅学习如何用 C 语言设计前端,但现在我决心修复它。

最佳答案

只需使用免费插件 vbAdvance .它允许您创建可从 C 调用的标准 DLL(而不是 COM DLL)。

它还使您可以访问许多其他高级构建功能和许多 IDE 便利功能。创建控制台应用程序,在您的 DLL 中创建 DllMain 入口点,XP 样式的 XP Manifest 编译器,支持终端服务器等。

(没有冒犯,但你在这里重新发明轮子,而不是开辟新天地!我也在 this answer 上链接到 vbAdvance。)

关于从 C 调用用 VB6 制作的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/866644/

相关文章:

c - 'readline/readline.h' 文件未找到

创建一个包含不同类型元素的数组

java - 如何调试 Java UnsatisfiedLinkError?

c# - 一个简单的 C# DLL - 如何从 Excel、Access、VBA、VB6 调用它?

c - _mm256_slli_si256 : error "last argument must be an 8-bit intermediate"

c - 是否有将代码从 C 语言转换为 Smalltalk 的工具?

c++ - 用冲突的命名空间替换 C++ 中的 dll

c++ - 如何使用 VC++ 2010 构建 koolplot 库

c - 串口编程?

c++ - 将 BSTR 从 C++ DLL 函数传递到 VB6 应用程序