Sreedhar Gunda4 Ответов: 0

Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена при вызове объекта .NET из COM


Я создаю интерфейса в IDL-файл и genreated построителя транспортной загрузки в COM
[
        uuid(E4ACB118-4729-4876-9F84-292815AE173B),
        oleautomation,
        object,
        dual
    ]

    interface IUser : IDispatch {

                                [id(0x60030009), helpstring("Brings up Framework Register dialog.")]

                                HRESULT Register([in] BSTR* sUserID,[in] BSTR* sUserName,[in]SalaryDetails* oSalaryDetails,[out, retval] long* );
                             }
<pre>

Now using this tlb as reference to my test tool which is in COM I am calling a method after creating the object by CreateObject with Progid as below.

<pre lang="vb">
Dim g_oUserSalDetails as ISalaryDetails
Set  g_oUserSalDetails = CreateObject(Salary.Application)
g_oUserSalDetails.Add("100","10,000")
Dim g_oUserDetails As IUser
Set g_oUserDetails = CreateObject(User.Application)
Dim llngRetun as long
llngRetun = oUserDetails.Register("100","Demo User", g_oUserSalDetails)


После вызова данные пользователя успешно регистрируются.
Все вышеперечисленные компоненты в COM. Теперь есть приложение DOT net, которое делает аналогичный регистр. Поэтому я должен использовать приложение, не меняя большого количества кода в тестовом инструменте. Таким образом, интерфейс dot net, который совпадает с IUser, я отметил его GUID таким же, как IUser, как показано ниже.

<ComVisible(True), InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("E4ACB118-4729-4876-9F84-292815AE173B")>

    Public Interface IEmployee

                     Function Register(ByVal EmpID As string,ByVal EmpName as 
                     String, ByVal EmpSalaryDetails as IEmpSalaryDetails) As Integer
    End Interface


На класс, который реализует этот интерфейс у меня отмечены программы, как ”пользователей.Применение”

<System.Runtime.InteropServices.ProgId("User.Application"), ComVisible(True)>
    Public Class Employee
        Implements IEmployee
Function Register(ByVal EmpID As string,ByVal EmpName as String,Byval EmpSalaryDetails as IEmpSalaryDetails) As Integer

   **Register implementation**
    End Interface

     End Class


Я сделал те же шаги и для ISalaryDetails и запустил regasm, чтобы получить эти значения в реестр.
Теперь в приведенном выше коде com.

Dim g_oUserSalDetails as ISalaryDetails
Set  g_oUserSalDetails = CreateObject(Salary.Application)
g_oUserSalDetails.Add("100","10,000")
Dim g_oUserDetails As IUser
Set g_oUserDetails = CreateObject(User.Application)
Dim llngRetun as long
llngRetun = oUserDetails.Register("100","Demo User", g_oUserSalDetails)


Объект create - это создание объекта Employee. Я мог видеть в окне отладки visual basic editor 6.0. Но метод register терпит неудачу с ошибкой.
“Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.”

Что я уже пробовал:

Я знаю, что это долгий вопрос. Спасибо, что прошли через это, любая помощь очень ценится. Извините за возможные опечатки

0 Ответов