2016-12-04 6 views
1

Я пытаюсь вызвать C++ COM DLL изнутри VB6.Неверный вызов вызова 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

Вы не используете COM для вызова COM-библиотеки. –

+0

@Noodles Что значит, пожалуйста? – tmighty

+0

Это COM-вызов. 'Set X = CreateObject (« Application.Object »): msgbox x.sonicChangeShortSpeed ​​(nIntegers (0), lSamples, dblSpeed, dblPitch, dblRate, dblVol, lUseChordPitch, lSampleRate, lNumChannels)' –

ответ

0

Если это COM-библиотека, вам необходимо добавить ее в проект VB6 в качестве ссылки, а затем вы можете получить доступ к классам и другим определениям COM, содержащимся в DLL.

Альтернативно вы можете просто зарегистрировать DLL, не добавляя его в качестве ссылки, а затем использовать «позднюю привязку» к вызовам CreateObject().

Но если вы не уверены, если это COM DLL, вы можете проверить с помощью:

  • Try, чтобы зарегистрировать его в команде, как с помощью regsvr32.exe (возможно, должны быть администратора). Если это сообщает об успехе, это означает, что это успешно зарегистрированная COM-библиотека DLL.
  • Перетащите его в программу Oleview, которая поставляется с Visual Studio. Если DLL является COM, то обычно будет иметь библиотеку типов, которую будет отображать Oleview. Если это не COM, это приведет к ошибке.

Если это не COM-библиотека, то я не думаю, что ваш подход обязательно сработает. Вы пытаетесь вызвать метод класса, как если бы это была обычная функция стиля C. Возможно, это сработает для статического метода C++, но, похоже, это не так.

Традиционная таблица импорта/экспорта DLL ничего не знает о классах. Возможно, вам понадобится написать связанную с C++ функцию вокруг объекта класса, которая затем может быть экспортирована и использована в VB6. Обертка должна обрабатывать создание объекта, его уничтожение и т. Д.

Смежные вопросы