C ++ DLL в VB сбой проблема - PullRequest
       4

C ++ DLL в VB сбой проблема

0 голосов
/ 09 декабря 2011

У меня есть dll, что кто-то сделал меня в C ++. Мне нужно было использовать эту dll в VB, чтобы сделать это, мне пришлось сделать еще одну dll в C ++, имеющую функции, которые я могу вызывать в VB.

Созданная мной C ++ dll имеет 4 функции. 2 функции обратного вызова, которые извлекают информацию из исходного C ++. И 2 функции, которые я могу вызвать из VB для отправки этой информации.

Я знаю, что оригинальная dll работает нормально, поскольку я бесконечно тестировал ее в консольном приложении.

Однако, когда я использую его с моими dll и VB .. я получаю случайные сбои.

В моем приложении VB почти нет кода, так как он только для тестирования. Он просто выводит информацию, поэтому проблем нет.

Я считаю, что проблема в C ++ DLL, которую я сделал. Я довольно новый с C ++.
Я думаю, возможно, к переменной получают доступ в 2spots одновременно (это возможно?) И вызывает ее сбой?

Вот основная компоновка моей C ++ DLL

//global variables
CString allInfo="";
char* info=new char[25000];

//call back function 1
HANDLE OnInfo(SendInfo* tempInfo)
{
    CString stringTemp="";
    stringTemp=tempInfo->infomessage;
    allInfo=allInfo+ stringTemp+"\n";
    return 0;
}

//function for vb
BSTR _stdcall vbInfo()
{
    allInfo=allInfo.Right(20000); //get last 20,000 characters
    strcpy_s(info,20000,allInfo);
    BSTR Message;
    Message = SysAllocStringByteLen (info, lstrlen(info));
    return Message;
}

Авария, кажется, происходит совершенно случайно.

Есть предложения?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 декабря 2011

Вы не сказали, скомпилирована ли ваша dll для использования строк Unicode или ANSI.Вы не сказали, скомпилирован ли dll, который предоставил вам другой человек, для использования строк Unicode или ANSI.Вызывающий VB, вероятно, дает вам строки Unicode, но можно заставить вызывающий VB выдавать вам строки ANSI.Итак, мы видим ваш код с CString неизвестного типа, char * указывает на строку ANSI, BSTR указывает на строку Unicode, но размер выделяется в байтах, и кто знает, что.

Существует множество статей, объясняющих, какиспользовать Unicode, но это было бы слишком тяжело для кого-то, кто довольно плохо знаком с C ++.

Было бы действительно лучше, если вы вернетесь к человеку, который сделал для вас другую dll, и спроситетот человек, чтобы добавить функции, которые вам нужны.Также упомяните им, что вы будете вызывать dll из VB, поэтому вам нужен их dll для обработки строк Unicode.

0 голосов
/ 09 декабря 2011

Помимо изучения того, что поиск в Google для ссылки на класс CString возвращает гм интересных результатов, вашей проблемой, вероятно, будет множественный доступ к CString.

Вы не опубликовали много информации, поэтому я предполагаю, что метод OnInfo является функцией обратного вызова, которая вызывается потоком выполнения, отличным от того, который вызывает vbInfo. В этом случае вы хотите посмотреть описание метода CString::operator=() в MSDN:

Оператор присваивания CString (=) реинициализирует существующую строку CString объект с новыми данными. Если строка назначения (то есть левая сторона) уже достаточно велика для хранения новых данных, нет новой памяти распределение выполняется. Вы должны знать, что исключения памяти может произойти всякий раз, когда вы используете оператор присваивания, потому что новое хранилище часто выделяется для хранения результирующего объекта CString.

Учитывая, что, похоже, нет ограничения на размер того, что вы помещаете в CString, это может быть освобождение и выделение памяти в allInfo в одной функции, когда вы читаете или пишете ее в других функциях , Не все так хорошо, когда вы вдруг пытаетесь записать в нераспределенную память.

Возможно, вы захотите посмотреть на что-то вроде Critical Section или мьютекс , чтобы обе ваши функции не теряли общий буфер памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...