繁体   English   中英

从C调用VB6中制作的DLL

[英]calling a DLL made in VB6 from C

好的,这是我遇到的最后一个问题的反面……我觉得我已经快要解决了,但它没有用。 以前,我试图用C编译DLL,然后从VB调用它,但我意识到这并不是我想要的(我希望程序使用C编写,同时使用VB前端,而不是前端是程序并使用DLL的功能)。

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

“但是等等,您不能使用VB编译DLL!” 实际上 ,我拦截了对链接器的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编译器,支持终端服务器等。

(没有冒犯,但您是在这里重塑方向,而不是开拓新天地!我在此答案上也链接到vbAdvance。)

您必须先在导出的函数中手动初始化VB6运行时,然后才能在运行时中使用任何功能。 查看紧凑型进程内多线程示例, ThreadEntry函数显示了如何执行此操作。

您将必须通过COM接口调用它,不是吗? 更像这样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM