Вызов DLL из VB6 из C - PullRequest
0 голосов
/ 15 мая 2009

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

Ответы [ 3 ]

2 голосов
/ 15 мая 2009

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

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

(Без обид, но вы заново изобретаете колесо, не открывая новые пути! Я связался с vbAdvance на этот ответ .)

2 голосов
/ 18 мая 2009

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

1 голос
/ 15 мая 2009

Вы бы назвали его через интерфейс COM, нет? Нечто подобное .

...