これは私が苦労した最後の質問の逆です...私はそれを得るのに近い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でフロントエンドを設計する方法を学ぶのではなく、かなりわかりにくく、ほとんど聞いたことがないことを理解していますが、今は修正することに決めました。
不思議で、VB6でインターフェイスを記述してC DLLを呼び出すのに間違ったことを説明できますか? VB6インターフェイスは、非常に薄いラッパーになる可能性があります。たとえば、http://martinfowler.com/eaaDev/PassiveScreen.htmlが好きな場合は「受動的な画面」 – MarkJ
私はおそらく他のプロジェクトでも使用しますが、このようにする方法を知っておくと便利です –