Создание DLL на C ++ - PullRequest
       18

Создание DLL на C ++

1 голос
/ 14 февраля 2011

Это дополнительный вопрос к этому вопросу , потому что я сейчас схожу с ума по этому вопросу.

Кто-то указал мне на эту статью иЯ пытаюсь скопировать оттуда раздел 4.

Поэтому я создал пустой проект C ++ в MSVC ++ 2010, создал новый файл .cpp внутри него и вставил туда следующий код:

#include <windows.h>
#define CCONV _declspec(dllexport) // used to be __stdcall but resulting DLL is identical

int CALLBACK LibMain (HANDLE hInstance, WORD wDataSeg, WORD wHeapSize,
LPSTR lpszCmdLine)
{
     return 1;
}

short CCONV PassInteger (short intgr, short far *pintgr)
{
    *pintgr = intgr;
    return intgr + 1;
}

(я получил LibMain код от здесь , но я думаю, что он здесь ничего не делает.)

Затем я добавил файл .def вспроецируйте и вставьте в него следующее:

;vb6dll32 DEF File
LIBRARY vb6dll32

CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE

EXPORTS
PassInteger

Компилятор выводит два предупреждения о том, что CODE и DATA в файле .def не поддерживаются для текущей цели, но в конечном итоге компилируется и генерирует файлvb6dll32.dll, который я затем скопировал в C:\windows\system и ...\system32 и C:\.

Затем я создал проект VB6, поместил кнопку в форму и добавил этот исходный код:

Private Declare Function PassInteger Lib "vb6dll32.dll" _
(ByVal intgr As Integer, pintgr As Integer) As Integer

Private Function BuiltIntest() As Integer

    Dim i As Integer
    Dim ir As Integer

    i = 7

    i = PassInteger(i, ir)
    Print i, ir

    Return

End Function

Private Sub Command1_Click()
    MsgBox (BuiltIntest())
End Sub

Теперь, когда я нажимаю кнопку, она по-прежнему выдает «Ошибка времени выполнения 53»: файл vb6dll32.dll не найден ».(Это происходит, даже если я указываю ему полный путь в исходном коде VB, например, «C: \ vb6dll32.dll», и файл определенно находится там. Я попытался указать его местоположение без пути и без «.dll» и т. Д., ничего не меняется.)

Меня также беспокоит то, что когда я запускаю regsvr32 c:\vb6dll32.dll, он также говорит мне: «Модуль C: \ vb6dll32.dll не может быть загружен. и т. д. и т. д.» .. Понятия не имеючто он должен делать, но это, как правило, должно что-то делать для файлов DLL, верно?

Что я делаю не так ?!Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 14 февраля 2011

В ваших примерах (код и вызов regsvr32) вы ссылаетесь на c:\vb6dll32.dll.Но вы сказали, что скопировали его в каталог system32.Указанный вами путь потребует, чтобы он был в корне.Поскольку вы скопировали его в каталог system32, он должен работать без какого-либо пути.Попробуйте удалить c:\ из названия.

Редактировать Так как я бьюсь по всем фронтам, вы, возможно, не решитесь последовать моему совету ... но Ходок зависимости может помочь решить эту проблему.Возможно, что DLL, необходимая вашей DLL, не найдена (например, одна из библиотек CRT).Это зависит от служебной программы.exe. Это очень полезный инструмент, который покажет, отсутствуют ли необходимые библиотеки DLL.

3 голосов
/ 14 февраля 2011

Может быть, ваш vb6dll32.dll динамически связан и зависит от таких вещей, как MSVCR100.dll, который нелегко найти.Проверьте импорт и поместите эти библиотеки рядом с файлом vb6dll32.dll или статически связывайте его (/ MT / LD).
Также вам не нужны эти строки CODE и DATA в файле .def.

1 голос
/ 14 февраля 2011

LibMain из 16-битных окон.Вы должны использовать DllMain.http://msdn.microsoft.com/en-us/library/ms682583(v=vs.85).aspx. Вы можете посмотреть на fdwReason против DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH, когда DLL загружается и выгружается с помощью LoadLibrary.Есть некоторые условия, которые вы можете использовать в DllMain, например, неуправляемый код.

...