использование C # DLL из C ++: проблема с функциями со строками в качестве параметров - PullRequest
2 голосов
/ 21 июня 2010

Начиная с этого примера: http://support.microsoft.com/kb/828736 Я попытался добавить тестовую функцию в мою C # DLL, которая принимает строки в качестве параметров.Мой код C # DLL выглядит следующим образом:

namespace CSharpEmailSender
{
   // Interface declaration.
   public interface ICalculator
   {
       int Add(int Number1, int Number2);
       int StringTest(string test1, string test2);
   };

// Interface implementation.
public class ManagedClass : ICalculator
{
    public int Add(int Number1, int Number2)
    {
        return Number1 + Number2;
    }

    public int StringTest(string test1, string test2)
    {
        if (test1 == "hello")
            return(1);

        if (test2 == "world")
            return(2);

        return(3);
    }
}

Затем я регистрирую эту DLL с помощью regasm.Я использую его в своем приложении на C ++ так:

using namespace CSharpEmailSender;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
// Initialize COM.
HRESULT hr = CoInitialize(NULL);

// Create the interface pointer.
ICalculatorPtr pICalc(__uuidof(ManagedClass));

long lResult = 0;
long lResult2 = 0;

pICalc->Add(115, 110, &lResult);
wprintf(L"The result is %d", lResult);

pICalc->StringTest(L"hello", L"world", &lResult2);
wprintf(L"The result is %d", lResult2);

// Uninitialize COM.
CoUninitialize();

return 0;

}

После запуска lResult верен (со значением 225), но lResult2 равен нулю.Есть идеи, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 21 июня 2010

Вы используете == для сравнения строк внутри StringTest, которое выполняет сравнение ссылок.Это работает (обычно) в чистом C #, потому что все строки интернированы, но строки, переданные через COM, будут not равными ссылочным эквивалентным строкам в C #.Попробуйте вместо этого использовать Equals.

0 голосов
/ 21 июня 2010

Не пытаясь скомпилировать это, возможно, взаимодействие ожидает, что строка будет иметь тип BSTR. Можете ли вы попробовать следующее?

pICalc->StringTest(CComBSTR(L"hello"), CComBSTR(L"world"), &lResult2);

ИЛИ

pICalc->StringTest(::SysAllocString(L"hello"), ::SysAllocString(L"world"), &lResult2); 
...