Хорошо, этот вопрос является обратным последнему вопросу, с которым я боролся ... Я чувствую, что я ооочень близок к получению, но это просто не работает.
Раньше я пытался скомпилировать DLL в C, а затем вызывать ее из VB, но я понял, что это не совсем то, чего я хочу (я хочу, чтобы программа была написана на C, при использовании внешнего интерфейса VB, а не внешнего интерфейса, являющегося программа и используя функциональность DLL).
Итак, сейчас я собираю DLL в VB и пытаюсь вызвать ее из C .exe.
"Но подождите, вы не можете скомпилировать DLL с VB!"
На самом деле , я перехватил вызов 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
и от С:
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;
}
когда я отлаживаю, я обнаруживаю нарушение доступа, которое в прошлом означало, что я забыл ByVal в функции VB, и он передавал ссылку на 5 или что-то еще. Но я не вижу здесь ничего плохого ... Я получаю ProcAddress из DLL, который совпадает со смещением, которое я получаю из dumpbin, я могу вызвать его из VB, но вызывающая сторона C получает нарушение прав доступа ...
Есть идеи? Кто-нибудь видит то, что я упустил? Я понимаю, что делаю что-то довольно непонятное и, в основном, неслыханное, вместо того, чтобы просто научиться проектировать интерфейс на C, но теперь я решил это исправить.