Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена при вызове объекта .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 терпит неудачу с ошибкой.
“Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.”
Что я уже пробовал:
Я знаю, что это долгий вопрос. Спасибо, что прошли через это, любая помощь очень ценится. Извините за возможные опечатки