Не откр DBF-таблица через польз DSN из СОМ
От: Аноним  
Дата: 25.10.06 15:39
Оценка:
Сделал обычный СОМ на ATL VC++.NET.
Программа-клиент C# вызывает поздним связыванием метод Connect().
C#

...
Type comType = Type.GetTypeFromProgID("COMPServer.Communication");
object comObject;
comObject = Activator.CreateInstance(comType);
Console.WriteLine(comObject.ToString());
Console.WriteLine(comType.FullName.ToString());
object[] parameters = new object[]{};
object result;
result=comType.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, 
null, comObject, parameters);
Console.WriteLine(result.ToString());
...


VC++

STDMETHODIMP CCommunication::Connect(int* rec)
{
    CString sDSN, sFName, sPath, sSQL;
    sDSN="vfp";
    sPath="c:\\temp\\";
    sFName=sPath+"dd050101.dbf";
    sFName=sPath+sFName;
    CDatabase* db=new CDatabase();
    if(db->Open(sDSN, FALSE, FALSE, _T("ODBC;DSN=%s;Driver={Microsoft Visual FoxPro Driver};UID=;PWD=;SourceType=DBF;", sDSN), FALSE))AfxMessageBox("Connect");//Работает!
...
}

В службе компонентов ХР создаю новое приложение COM+. Добавляю компонент СОМ.
Вызываю метод Connect():
if(db->Open(...))AfxMessageBox("Connect");//JIT выдает:
Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the ta
rget of an invocation. ---> System.Runtime.InteropServices.COMException (0x800706BE): Сбой при удален
ном вызове процедуры.
--- End of inner exception stack trace ---
at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object
[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
at System.RuntimeType.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object tar
get, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Ob
ject[] args)
at app3.Class1.Main(String[] args) in c:\lang\technoop\lab1\app3\app3\class1.cs:line 51

Что не так??
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.