2016-12-04 14 views
1

VB6からC++ COM DLLを呼び出そうとしています。間違った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 DLLを呼び出すことはありません。 –

+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 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でエクスポートして使用することができます。ラッパーはオブジェクトの作成、破壊などを処理する必要があります。

関連する問題