Хорошо, это один из обращений к последнему вопросу, с которым я боролся ... Я чувствую, что я близок к тому, чтобы получить его, но он просто не работает. Раньше я пытался скомпилировать DLL на C, а затем называть его из VB, но я понял, что это не совсем то, что я хочу (я хочу, чтобы программа была написана на C, при использовании интерфейса VB, а не во внешнем интерфейсе программа и использование функциональности DLL).вызов DLL, сделанный в VB6 от C
Итак, теперь я собираю DLL в VB и пытаюсь вызвать его из C .exe.
«Но подождите, вы не можете скомпилировать DLL с VB!» Actually, я перехватил вызов VB6.EXE компоновщику и добавил файл определения для функций, которые я хочу экспортировать, и вот лучшая часть - если я скопирую dll в system32, я могу вызвать функции из другого VB программа, и она отлично работает. Единственное, что я не могу загрузить с C. Ну, я могу, и я получаю дескриптор, и я получаю адрес функций, это просто программа не работает.
Вот фиктивная функция Я экспортировал:
Public Function PopupMessage(ByVal rawr As Integer) As Integer
Msgbox "HERE BE " & rawr & " DRAGON(S)."
PopupMessage = 4
End Function
Я могу назвать это, как это из другой программы VB6:
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
и от C:
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;
}
, когда я debug, я узнаю, что я получаю нарушение прав доступа, которое в прошлом означало, что я забыл ByVal в функции VB и он передавал ссылку на 5 или что-то в этом роде. Но я не вижу ничего плохого здесь ... Я получаю ProcAddress из DLL, который соответствует смещению, которое я получаю от dumpbin, я могу назвать его из VB, но вызывающий C получает нарушение доступа ...
Любые идеи? Кто-нибудь видит то, что я забыл? Я понимаю, что делаю что-то довольно неясное и, в основном, неслыханное, вместо того, чтобы просто научиться проектировать передний конец на C, но теперь я решил его исправить.
Из любопытства вы можете объяснить, что не так с написанием интерфейса в VB6 и вызовом C DLL? Интерфейс VB6 может быть очень тонкой оболочкой - «пассивный экран», если вам нравится http://martinfowler.com/eaaDev/PassiveScreen.html – MarkJ
Я мог бы, я, вероятно, буду использовать это и в других проектах, но я думаю, d Полезно знать, как это сделать так –