【问题标题】:Wrong DLL calling convention错误的 DLL 调用约定
【发布时间】:2017-04-19 07:08:34
【问题描述】:

我正在尝试从 VB6 中调用 C++ COM DLL。

C++ 代码是:

STDMETHODIMP CSonic::sonicChangeShortSpeed(
SHORT* samples, 
LONG *numSamples, 
FLOAT speed, 
FLOAT pitch, 
FLOAT rate, 
FLOAT volume, 
LONG useChordPitch, 
LONG sampleRate, 
LONG numChannels
)

我在 VB6 中这样称呼它:

Private Declare Function sonicChangeShortSpeed Lib "SonicLIB.dll" Alias "#1" (
ByRef samples As Integer, 
ByRef numSamples As Long, 
ByVal speed As Double, 
ByVal pitch As Double, 
ByVal rate As Double, 
ByVal volume As Double, 
ByVal useChordPitch As Long, 
ByVal sampleRate As Long, 
ByVal numChannels As Long) 
As Long

在我的代码中,我使用:

Dim nIntegers() As Integer
ReDim nIntegers(2047)

Dim lSamples As Long
Dim dblSpeed As Double
Dim dblPitch As Double
Dim dblRate As Double
Dim dblVol As Double
Dim lUseChordPitch As Long
Dim lSampleRate As Long
Dim lNumChannels As Long

lSamples = 2048
dblSpeed = 0.5
dblPitch = 0
dblRate = 1
dblVol = 1
lUseChordPitch = 1
lSampleRate = 48000
lNumChannels = 1

Dim lRet As Long
lRet = sonicChangeShortSpeed(nIntegers(0), lSamples, dblSpeed, dblPitch, dblRate, dblVol, lUseChordPitch, lSampleRate, lNumChannels)

最后一行产生“错误的调用约定”错误。

有人看到我的错误吗?

谢谢!

【问题讨论】:

  • 您没有使用 COM 调用 COM dll。
  • @Noodles 请问这是什么意思?
  • 这是一个 COM 调用。 Set X = CreateObject("Application.Object"): msgbox x.sonicChangeShortSpeed(nIntegers(0), lSamples, dblSpeed, dblPitch, dblRate, dblVol, lUseChordPitch, lSampleRate, lNumChannels)
  • 听起来不错,谢谢。你认为这就是答案吗?
  • 我找不到该库作为 COM 库。 Unix 没有 COM,这似乎是它的根源。那么为什么你认为它是一个 COM dll?

标签: c++ dll com vb6


【解决方案1】:

如果这是一个 COM DLL,您需要将它添加到您的 VB6 项目中作为参考,然后您可以访问 DLL 中包含的类和其他 COM 定义。

或者,您可以只注册 DLL 而不将其添加为引用,然后将“后期绑定”与 CreateObject() 调用一起使用。

但如果您不确定它是否是 COM DLL,您可以通过以下方式检查:

  • 尝试在命令上注册它,例如使用 regsvr32.exe(可能需要管理员权限)。如果这报告成功,则意味着它是一个成功注册的 COM DLL。
  • 将其拖放到 Visual Studio 附带的 Oleview 程序中。如果 DLL 是 COM,它通常会有一个 Oleview 将显示的类型库。如果不是 COM,则会产生错误。

如果它不是 COM DLL,那么我认为您的方法不一定有效。您试图调用一个类方法,就好像它是一个普通的“C”风格函数。也许这适用于静态 C++ 方法——但这里似乎并非如此。

DLL 的传统导入/导出表对类一无所知。您可能需要围绕您的类对象编写一个 C++ 包装函数,然后可以将其导出并在 VB6 中使用。包装器必须处理对象的创建、销毁等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多