错误的DLL调用约定

时间:2016-12-04 23:26:56

标签: c++ dll com vb6

我试图从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)

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

有人看到我的错误吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

或者你可以只注册DLL而不添加它作为参考,然后使用'后期绑定'使用CreateObject()调用。

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

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

如果它不是COM DLL,那么我认为你的方法不一定有效。您正试图将类方法称为正常的C' C'风格功能。也许这适用于静态C ++方法 - 但这似乎不是这里的情况。

DLL的传统导入/导出表对类没有任何了解。您可能需要在类对象周围编写一个C ++包装函数,然后可以在VB6中导出和使用它。包装器必须处理对象创建,销毁等。