2009-05-15 182 views
0

これは私が苦労した最後の質問の逆です...私はそれを得るのに近いsoooだと感じていますが、うまく動作しません。 前に、私はCでDLLをコンパイルしようとしていましたが、VBから呼び出すことができましたが、実際には私が望むものではないことに気づきました。(VBでフロントエンドではなくCで書かれています。プログラムとDLLの機能を使用して)。VB6で作成されたDLLをCから呼び出す

これで、VBでDLLをコンパイルし、C .exeからDLLを呼び出そうとしています。

「しかし、VBでDLLをコンパイルすることはできません!」 Actually、リンカへのVB6.EXEの呼び出しを傍受し、エクスポートする関数の定義ファイルを追加しました。ここでは、DLLをsystem32にコピーすると別のVBから関数を呼び出すことができますプログラムとそれは正常に動作します。 ただ、Cから読み込むことができないようです。さて、私はハンドルを取得し、関数のアドレスを取得します。プログラムが失敗しただけです。 Cから、

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 

と::

Public Function PopupMessage(ByVal rawr As Integer) As Integer 
    Msgbox "HERE BE " & rawr & " DRAGON(S)." 
    PopupMessage = 4 
End Function 

は、私は別のVB6のプログラムからこのようにそれを呼び出すことができます。

ここで私は、エクスポートダミー関数です

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; 
} 

Iデバッグ、私は、私はVBの関数でByValを忘れていたことを意味していた過去にアクセス違反が発生していることを知り、それは5か何かへの参照を渡していた。しかし、私はここで何か間違って見ることはできません...私はダンプビンから取得したオフセットと一致するDLLからProcAddressを取得、私はVBから呼び出すことができますが、Cの呼び出し元はアクセス違反を取得しています...

アイデア?私が見落としたことを誰かが見ていますか?私は、Cでフロントエンドを設計する方法を学ぶのではなく、かなりわかりにくく、ほとんど聞いたことがないことを理解していますが、今は修正することに決めました。

+0

不思議で、VB6でインターフェイスを記述してC DLLを呼び出すのに間違ったことを説明できますか? VB6インターフェイスは、非常に薄いラッパーになる可能性があります。たとえば、http://martinfowler.com/eaaDev/PassiveScreen.htmlが好きな場合は「受動的な画面」 – MarkJ

+0

私はおそらく他のプロジェクトでも使用しますが、このようにする方法を知っておくと便利です –

答えて

2

フリーアドインvbAdvanceを使用してください。これにより、COM DLLではなくCから呼び出し可能な標準DLLを作成できます。

また、他の多くの高度なビルド機能や多くのIDE便利機能にアクセスできます。コンソールアプリケーションの作成、DLLのDllMainエントリポイントの作成、XPスタイルのXPマニフェストコンパイラのサポート、ターミナルサーバーのサポートなど。

(嫌なことはありませんが、 vbAdvance on this answer

1

COMインターフェイス経由で呼び出す必要がありますか? Something more like this

+0

ああ神様... "...void main(void) (コンソールアプリケーション用) " not voidmainvoid! –

2

実行時に関数を使用する前に、VB6ランタイムをエクスポートした関数で手動でに初期化する必要があります。 Compact In-Process Multi-threadingサンプルをチェックしてください。ThreadEntry関数はその処理方法を示しています。

関連する問題