Странная таблица экспорта мусорной корзины - PullRequest
0 голосов
/ 07 апреля 2010

Переписываю c ++ dll и пытаюсь получить доступ к его функциям. Ниже приведен вывод дампа / экспорта из dll:

Dump of file C:\C#Processes\SummarizerApp\SummarizerApp\lib\summarizer37.dll
File Type: DLL
Section contains the following exports for summarizer37.dll

00000000 characteristics
458962FF time date stamp Wed Dec 20 11:21:19 2006
    0.00 version
       1 ordinal base
       4 number of functions
       4 number of names

ordinal hint RVA      name

      1    0 00002960 ?delete_summarization@inxight@@YAXPAVsummarization_interface@1@@Z
      2    1 00016240 ?delete_summarizer@inxight@@YAXPAVsummarizer_interface@1@@Z
      3    2 000105E0 ?make_summarization@inxight@@YAPAVsummarization_interface@1@AAVsummarizer_interface@1@AAVbyte_stream_interface@1@ABVsummarization_input_options@1@ABVsummarization_sentence_output@1@ABVsummarization_phrase_output@1@PBDI5@Z
      4    3 0001BC40 ?make_summarizer@inxight@@YAPAVsummarizer_interface@1@PBD00@Z

Summary

    4000 .data
    B000 .rdata
    4000 .reloc
   2E000 .text

Обратите внимание на порядковый номер 3. Он включает в себя несколько методов, которые мне нужно вызвать, а именно:
make_summarization
summarization_input_options
summarization_sentence_output
sumrization_phrase_output

Сделал JNI-обертку этой dll и знаю, что функции выше (которые все являются конструкторами классов) доступны из "extern C", который использует JNI, в неупорядоченной форме. Могу ли я использовать свойство соглашения о вызовах dllimport для доступа к ним без украшений?

В мире C ++, что это означает, когда несколько функций экспортируются по одному и тому же порядковому номеру и каков метод доступа к ним? Спасибо, Jim

1 Ответ

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

Поле EntryPoint атрибута DllImport можно использовать для импорта функций по порядковому номеру (с порядковым номером #).
Он также может быть использован для импорта функций по искаженному имени .
Если у вас действительно есть чистые обертки "extern C" для всех функций, предоставляемых библиотекой C ++, это легко.
Если вы этого не сделаете, вы можете создать оболочки C ++ / CLI для связи между управляемым и неуправляемым.

undname.exe в папке vc\bin может использоваться для дешифрирования скомпилированных имен C ++:

class inxight::summarization_interface * __cdecl inxight::make_summarization(
   class inxight::summarizer_interface &,
   class inxight::byte_stream_interface &,
   class inxight::summarization_input_options const &,
   class inxight::summarization_sentence_output const &, 
   class inxight::summarization_phrase_output const &,
   char const *, unsigned int , char const *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...