2009-05-15 2 views
0

Хорошо, это один из обращений к последнему вопросу, с которым я боролся ... Я чувствую, что я близок к тому, чтобы получить его, но он просто не работает. Раньше я пытался скомпилировать 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, но теперь я решил его исправить.

+0

Из любопытства вы можете объяснить, что не так с написанием интерфейса в VB6 и вызовом C DLL? Интерфейс VB6 может быть очень тонкой оболочкой - «пассивный экран», если вам нравится http://martinfowler.com/eaaDev/PassiveScreen.html – MarkJ

+0

Я мог бы, я, вероятно, буду использовать это и в других проектах, но я думаю, d Полезно знать, как это сделать так –

ответ

2

Просто используйте бесплатную надстройку vbAdvance. Он позволяет создавать стандартные DLL-файлы, которые можно вызывать из C (а не из COM-библиотек).

Он также дает вам доступ ко многим другим расширенным функциям сборки и множеству функций IDE. Создавайте консольные приложения, создавайте точку входа DllMain в своих DLL, XP Manifest-компилятор для стилей XP, поддерживайте Terminal Server и т. Д.

(Не обижайтесь, но вы изобретаете колесо здесь, а не ломаете новую землю! vbAdvance на this answer тоже.)

1

Вам нужно будет позвонить через интерфейс COM, нет? Something more like this.

+0

oh god ... "...void main (void) (для консольных приложений) " не voidmainvoid! –

2

Вы должны инициализировать VB6 время выполнения вручную в вашей экспортируемой функции, перед использованием любой функции в реальном времени. Проверьте образец Compact In-Process Multi-threading, функция ThreadEntry показывает, как это сделать.

Смежные вопросы