Использование MSADO15.DLL и C ++ с MinGW / GCC в Windows Vista - PullRequest
0 голосов
/ 27 апреля 2010

Введение

Привет

Я очень новичок в C ++, это мое первое заявление.

Я изначально начал с VC ++ 2008 Express, я заметил, что GCC становится своего рода стандартом, поэтому я пытаюсь сделать правильные шаги с самого начала.

Я написал фрагмент кода, который подключается к MSSQL Server через ADO, на VC ++ он работает как чудо, импортируя MSADO15.dll:

# import "msado15.dll" no_namespace rename ("EOF", "EndOfFile")

Поскольку я собираюсь перейти с VC ++, я искал альтернативную (в конечном итоге многоплатформенную) IDE, поэтому я придерживаюсь (на этот раз) Code :: Block ( Я использую последнюю ночную сборку, SVN 6181 ).

В качестве компилятора я предпочитаю использовать GCC 3.4.5 (портирован через MinGW 5.1.6) под Vista.

Я пытался скомпилировать простое приложение "hello world" с GCC, которое использует / импортирует тот же файл msado15.dll (#import "c: \ Program Files \ Common Files \ System \ ADO \ msado15.dll" no_namespace rename ( «EOF», «EndOfFile»)) и я был удивлен, увидев множество ошибок во время компиляции.

Я ожидал, что директива компилятора #import сгенерирует библиотеку из "msado15.dll", чтобы она могла ссылаться на нее позже (время редактирования ссылки или что-то еще). Вместо этого он пытался прочитать его как обычный файл (например, заголовочный файл, если хотите), потому что он пытался интерпретировать каждую строку в DLL (которая имеет подпись MZ):

Пример:

Компиляция: main.cpp
E: \ MyPath \ main.cpp: 2: 64: предупреждение: дополнительные токены в конце директивы #import
В файле из E: \ MyPath \ main.cpp: 2:
c: \ Program Files \ Common Files \ System \ ADO \ msado15.dll: 1: ошибка: отклонение '\ 144' в программе
В файле из E: \ MyPath \ main.cpp: 2: c: \ Program Files \ Common Files \ System \ ADO \ msado15.dll: 1: 4: предупреждение: нулевые символы игнорируются
c: \ Program Files \ Common Files \ System \ ADO \ msado15.dll: 1: ошибка: отклонение '\ 3' в программе c: \ Program Files \ Common Files \ System \ ADO \ msado15.dll: 1: 6: предупреждение: нулевые символы игнорируются
c: \ Program Files \ Common Files \ System \ ADO \ msado15.dll: 1: ошибка: отклонение '\ 4' в программе ...
и т. д.

МОЙ ВОПРОС

Что ж, очевидно, что в этой версии GCC директива #import не выполняет ожидаемую работу (возможно, #import больше не поддерживается GCC), поэтому, наконец, мой вопрос:

  • как использовать ADO для доступа к базе данных MSSQL в программе на C ++, скомпилированной с GCC (v3.4.5)?

Ответы [ 3 ]

1 голос
/ 27 апреля 2010

Что происходит, когда вы пытаетесь импортировать очень нестандартный и специфичный для MSVC COM-объект ...

AFAIK Поддержка COM с MSYS еще далека от совершенства, ищите: "компонентная объектная модель" и gcc в google.

Я бы предложил использовать FreeTDS или библиотеку типа SOCI для связи с MS-SQL. Это также кроссплатформенный ;-)

1 голос
/ 27 апреля 2010

Директива #import не является частью стандартного языка программирования C ++. Я не знаю, что (если что-нибудь) это делает в GCC. Обычный способ использования DLL - включить в код свой заголовочный файл (ы), а затем связать его с библиотекой импорта (файл .LIB). Я никогда не программировал в ADO, но в ODBC вы бы

#include <sql.h>

и при компиляции / компоновке

g++ mystuff.cpp -lodbc32

для получения библиотеки импорта.

Кроме того, версия используемого вами компилятора MinGW очень старая. Вы можете получить гораздо более актуальную информацию по http://tdragon.net/recentgcc.

0 голосов
/ 27 апреля 2010

GCC и MSVC используют #import для разных вещей. В GCC #import является вариантом #include для target-c, который включает заголовочный файл только один раз. В MSVC #import запускает расширение Microsoft, которое создает реализацию интеллектуального указателя и файлы заголовков из библиотеки типов COM.

В GCC вам придется импортировать COM-объект по старинке. Найдите существующие определения интерфейса или используйте инструмент, такой как OleSpy, для генерации определений из tlb.

...