从C调用VB6中生成的DLL

时间:2009-05-15 01:18:00

标签: 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中获取了与来自dumpbin的偏移相匹配的ProcAddress,我可以从VB调用它,但是C调用者正在获取访问冲突...

有什么想法吗?有人看到我忽略的东西吗?我意识到我正在做一些非常模糊和大多数闻所未闻的事情,而不仅仅是学习如何用C设计前端,但现在我决定修复它。

3 个答案:

答案 0 :(得分:2)

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

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

(没有冒犯,但是你在这里重新发明轮子,没有突破新的领域!我也在[{3}}上链接到了vbAdvance。)

答案 1 :(得分:2)

在运行时使用任何函数之前,必须在导出的函数中初始化VB6运行时手动。查看Compact In-Process Multi-threading示例,ThreadEntry函数显示如何操作。

答案 2 :(得分:1)

你必须通过COM接口调用它,不是吗? Something more like this