Midl command line error midl1005 cannot find c preprocessor cl exe

Вопрос по утилите midl.exe

Всем доброго времени суток.
Имеется некоторая OCX библиотека. Нужно сгенерировать файлы врапперы для последующего подключения этот библиотеки в проект на VC.
Собственно, проблема состоит в том что бы разобраться с параметрами командной строки для midl.exe: утилите все время чего нибудь не хватает.
Директиву import просьба не предлагать.

Здравствуйте, hKarel, Вы писали:

K>Всем доброго времени суток.

K>Имеется некоторая OCX библиотека. Нужно сгенерировать файлы врапперы для последующего подключения этот библиотеки в проект на VC.
K>Собственно, проблема состоит в том что бы разобраться с параметрами командной строки для midl.exe: утилите все время чего нибудь не хватает.
K>Директиву import просьба не предлагать.

Вообще-то midl.exe нужен для компиляции *.idl файлов в двоичные *.tlb с дополнительной генерацией *.h и *.c файлов с описанием интерфейсов. Причём будут не врапперы, а голые интерфейсы. Из вашего поста неясно, есть ли у вас *.idl файл для вашего компонента. Если нет, то idl можно сгенерить, открыв *.ocx в OLE Viewer-е. Для компиляции idl проще всего добавить его в проект, и студия сама разберётся как вызвать midl для этого файла. Если всё таки есть желание вызывать midl вручную, то сначала нужно прописать нужные переменные окружения. Напрмер так:

set include=E:Program FilesMicrosoft Visual Studio .NET 2003Vc7PlatformSDKInclude
set path=%path%;E:Program FilesMicrosoft Visual Studio .NET 2003Common7ide
set path=%path%;E:Program FilesMicrosoft Visual Studio .NET 2003Common7Toolsbin
set path=%path%;E:Program FilesMicrosoft Visual Studio .NET 2003Vc7bin
midl my_ocx.idl

Добрый день, SuhanovSergey, Вы писали:

SS>Здравствуйте, hKarel, Вы писали:


SS>Вообще-то midl.exe нужен для компиляции *.idl файлов в двоичные *.tlb с дополнительной генерацией *.h и *.c файлов с описанием интерфейсов. Причём будут не врапперы, а голые интерфейсы. Из вашего поста неясно, есть ли у вас *.idl файл для вашего компонента. Если нет, то idl можно сгенерить, открыв *.ocx в OLE Viewer-е. Для компиляции idl проще всего добавить его в проект, и студия сама разберётся как вызвать midl для этого файла. Если всё таки есть желание вызывать midl вручную, то сначала нужно прописать нужные переменные окружения. Напрмер так:


SS>

SS>set include=E:Program FilesMicrosoft Visual Studio .NET 2003Vc7PlatformSDKInclude
SS>set path=%path%;E:Program FilesMicrosoft Visual Studio .NET 2003Common7ide
SS>set path=%path%;E:Program FilesMicrosoft Visual Studio .NET 2003Common7Toolsbin
SS>set path=%path%;E:Program FilesMicrosoft Visual Studio .NET 2003Vc7bin
SS>midl my_ocx.idl
SS>

Дествительно из моего поста неясно есть ли у меня IDL. Но мне показаалось, что не нужно заострять на этом внимание, т.к. MIDL по умолчанию работает с IDL.
Попробовал Ваш рецепт.
Получил сообщение:
midl : command line error MIDL1005 : cannot find C preprocessor cl.exe

На данный момент добрые люди с другоко форума предложили такое решение:
call «%VS71COMNTOOLS%vsvars32.bat»
echo #include «stdafx.h» > tmp309.cpp
echo #import «%1» >> tmp309.cpp
cl /c tmp309.cpp
rem del tmp309.cpp
del tmp309.obj

В принципе все работает, единственно, что генерятся «голые» врапперы (файлы tlh, tli). А вот как сгенерить враппер для ActiveX компонента, так что бы врапепер наследовался от класса CWnd для меня пока остается загадкой.

Здравствуйте, hKarel, Вы писали:

K>Добрый день, SuhanovSergey, Вы писали:


SS>>Здравствуйте, hKarel, Вы писали:


K>Попробовал Ваш рецепт.

K>Получил сообщение:
K>midl : command line error MIDL1005 : cannot find C preprocessor cl.exe
Я надеюсь вы подправили рецепт в соотвествие с вашими путями.
А вообще лучше так:

call "%VS71COMNTOOLS%vsvars32.bat"
midl my_ocx.idl


K>На данный момент добрые люди с другоко форума предложили такое решение:

K>call «%VS71COMNTOOLS%vsvars32.bat»
K>echo #include «stdafx.h» > tmp309.cpp
K>echo #import «%1» >> tmp309.cpp
K>cl /c tmp309.cpp
K>rem del tmp309.cpp
K>del tmp309.obj
Но это же противоречит «Директиву import просьба не предлагать.»

K>В принципе все работает, единственно, что генерятся «голые» врапперы (файлы tlh, tli). А вот как сгенерить враппер для ActiveX компонента, так что бы врапепер наследовался от класса CWnd для меня пока остается загадкой.

Почему бы не инсталлировать контрол в toolbox вручную. Это же разовая операция.

Содержание

  1. Scons source cannot find C preprocessor cl.exe Windows 10 #7170
  2. Comments
  3. Midl command line error midl1005 cannot find c preprocessor cl exe
  4. Лучший отвечающий
  5. Вопрос
  6. Ответы
  7. Midl command line error midl1005 cannot find c preprocessor cl exe
  8. Answered by:
  9. Question
  10. Answers
  11. Midl command line error midl1005 cannot find c preprocessor cl exe
  12. Answered by:
  13. Question
  14. Answers
  15. Midl command line error midl1005 cannot find c preprocessor cl exe
  16. Answered by:
  17. Question
  18. Answers

Scons source cannot find C preprocessor cl.exe Windows 10 #7170

Cannot run scons source.
I open the Developer Command prompt, and run vcvarsall.bat. But scons still fails.
It cannot find cl.exe. Though when I run «where cl.exe» , the response gives me a path.

I can run the failing command by hand without errors.
Here’s the command prompt output:-

`Developer Command Prompt for VS 2017

nvda> C:Program Files (x86)Microsoft Visual Studio2017CommunityVCAuxiliaryBuildvcvarsall.bat» x86 10.0.15063.0

** Visual Studio 2017 Developer Command Prompt v15.0.26430.4
** Copyright (c) 2017 Microsoft Corporation

[vcvarsall.bat] Environment initialized for: ‘x86’

nvda>scons source
scons: Reading SConscript files .
scons: done reading SConscript files.
scons: Building targets .
MIDL.EXE /nologo /win32 /tlb buildx86acrobatAccess.tlb /h buildx86acrobatAccess.h /iid buildx86acrobatAccess_i.c /proxy buildx86acrobatAccess_p.c /dlldata buildx86acrobatAccess_data.c buildx86acrobatAccess.idl
Processing buildx86acrobatAccess.idl
midl : command line error MIDL1005 : cannot find C preprocessor cl.exe
scons: *** [buildx86acrobatAccess.tlb] Error 1005
scons: building terminated because of errors.

nvda>where cl.exe
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.10.25017binHostX86x86cl.exe

nvda>where midl.exe
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.10.25017binHostX86x86cl.exe

nvda>MIDL.EXE /nologo /win32 /tlb buildx86acrobatAccess.tlb /h buildx86acrobatAccess.h /iid buildx86acrobatAccess_i.c /proxy buildx86acrobatAccess_p.c /dlldata buildx86acrobatAccess_data.c buildx86acrobatAccess.idl
Processing buildx86acrobatAccess.idl
acrobatAccess.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoaidl.idl
oaidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umobjidl.idl
objidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umunknwn.idl
unknwn.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedwtypes.idl
wtypes.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedwtypesbase.idl
wtypesbase.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedbasetsd.h
basetsd.h
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedguiddef.h
guiddef.h
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umocidl.idl
ocidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoleidl.idl
oleidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umservprov.idl
servprov.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umurlmon.idl
urlmon.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0ummsxml.idl
msxml.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoleacc.idl
oleacc.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoaidl.acf
oaidl.acf
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umocidl.acf
ocidl.acf`

The text was updated successfully, but these errors were encountered:

Источник

Midl command line error midl1005 cannot find c preprocessor cl exe

Лучший отвечающий

Вопрос

I have a problem with building my project using VS 2015 Professional.

I get this error:

TRACKER : error TRK0005: Failed to locate: «midl.exe». The system cannot find the file specified.

I’ve tried the fixes from this thread but it doesn’t work. VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

Are there any settings I missed?

Ответы

Thank you for posting in MSDN forum.

>>VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

This error info always means corrupt source problem. Please refer to this thread:

Here are my suggestions:

1. Insert a good VS2013 installer on your machine.

VS 2013 iso Microsoft official download link:

VS 2015 iso files SHA-1 Values link:

Please use FCIV http://support.microsoft.com/kb/841290 to verify hash of the ISO.
Any discrepancy would indicate that the file was corrupted. Here is a blog for how to use it, you can refer to it.

2. Use the ISO to repair your VS 2013.

please use http://aka.ms/vscollect to gather the installation logs. After using it, you will find vslogs.cab from %temp% folder. Please upload the file to https://onedrive.live.com/ and share the link here

We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

Источник

Midl command line error midl1005 cannot find c preprocessor cl exe

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I have a problem with building my project using VS 2015 Professional.

I get this error:

TRACKER : error TRK0005: Failed to locate: «midl.exe». The system cannot find the file specified.

I’ve tried the fixes from this thread but it doesn’t work. VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

Are there any settings I missed?

Answers

Thank you for posting in MSDN forum.

>>VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

This error info always means corrupt source problem. Please refer to this thread:

Here are my suggestions:

1. Insert a good VS2013 installer on your machine.

VS 2013 iso Microsoft official download link:

VS 2015 iso files SHA-1 Values link:

Please use FCIV http://support.microsoft.com/kb/841290 to verify hash of the ISO.
Any discrepancy would indicate that the file was corrupted. Here is a blog for how to use it, you can refer to it.

2. Use the ISO to repair your VS 2013.

please use http://aka.ms/vscollect to gather the installation logs. After using it, you will find vslogs.cab from %temp% folder. Please upload the file to https://onedrive.live.com/ and share the link here

We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

Источник

Midl command line error midl1005 cannot find c preprocessor cl exe

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I have a problem with building my project using VS 2015 Professional.

I get this error:

TRACKER : error TRK0005: Failed to locate: «midl.exe». The system cannot find the file specified.

I’ve tried the fixes from this thread but it doesn’t work. VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

Are there any settings I missed?

Answers

Thank you for posting in MSDN forum.

>>VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

This error info always means corrupt source problem. Please refer to this thread:

Here are my suggestions:

1. Insert a good VS2013 installer on your machine.

VS 2013 iso Microsoft official download link:

VS 2015 iso files SHA-1 Values link:

Please use FCIV http://support.microsoft.com/kb/841290 to verify hash of the ISO.
Any discrepancy would indicate that the file was corrupted. Here is a blog for how to use it, you can refer to it.

2. Use the ISO to repair your VS 2013.

please use http://aka.ms/vscollect to gather the installation logs. After using it, you will find vslogs.cab from %temp% folder. Please upload the file to https://onedrive.live.com/ and share the link here

We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

Источник

Midl command line error midl1005 cannot find c preprocessor cl exe

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I have a problem with building my project using VS 2015 Professional.

I get this error:

TRACKER : error TRK0005: Failed to locate: «midl.exe». The system cannot find the file specified.

I’ve tried the fixes from this thread but it doesn’t work. VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

Are there any settings I missed?

Answers

Thank you for posting in MSDN forum.

>>VS2013 Compiler error — error TRK0005: Failed to locate: «midl.exe»

This error info always means corrupt source problem. Please refer to this thread:

Here are my suggestions:

1. Insert a good VS2013 installer on your machine.

VS 2013 iso Microsoft official download link:

VS 2015 iso files SHA-1 Values link:

Please use FCIV http://support.microsoft.com/kb/841290 to verify hash of the ISO.
Any discrepancy would indicate that the file was corrupted. Here is a blog for how to use it, you can refer to it.

2. Use the ISO to repair your VS 2013.

please use http://aka.ms/vscollect to gather the installation logs. After using it, you will find vslogs.cab from %temp% folder. Please upload the file to https://onedrive.live.com/ and share the link here

We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

Источник

Hi,

Cannot run scons source.
I open the Developer Command prompt, and run vcvarsall.bat. But scons still fails.
It cannot find cl.exe. Though when I run «where cl.exe» , the response gives me a path.

I can run the failing command by hand without errors.
Here’s the command prompt output:-

========================================

`Developer Command Prompt for VS 2017

cd nvda

nvda> C:Program Files (x86)Microsoft Visual Studio2017CommunityVCAuxiliaryBuildvcvarsall.bat» x86 10.0.15063.0


** Visual Studio 2017 Developer Command Prompt v15.0.26430.4
** Copyright (c) 2017 Microsoft Corporation


[vcvarsall.bat] Environment initialized for: ‘x86’

nvda>scons source
scons: Reading SConscript files …
scons: done reading SConscript files.
scons: Building targets …
MIDL.EXE /nologo /win32 /tlb buildx86acrobatAccess.tlb /h buildx86acrobatAccess.h /iid buildx86acrobatAccess_i.c /proxy buildx86acrobatAccess_p.c /dlldata buildx86acrobatAccess_data.c buildx86acrobatAccess.idl
Processing buildx86acrobatAccess.idl
midl : command line error MIDL1005 : cannot find C preprocessor cl.exe
scons: *** [buildx86acrobatAccess.tlb] Error 1005
scons: building terminated because of errors.

nvda>where cl.exe
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.10.25017binHostX86x86cl.exe

nvda>where midl.exe
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.10.25017binHostX86x86cl.exe

nvda>MIDL.EXE /nologo /win32 /tlb buildx86acrobatAccess.tlb /h buildx86acrobatAccess.h /iid buildx86acrobatAccess_i.c /proxy buildx86acrobatAccess_p.c /dlldata buildx86acrobatAccess_data.c buildx86acrobatAccess.idl
Processing buildx86acrobatAccess.idl
acrobatAccess.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoaidl.idl
oaidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umobjidl.idl
objidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umunknwn.idl
unknwn.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedwtypes.idl
wtypes.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedwtypesbase.idl
wtypesbase.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedbasetsd.h
basetsd.h
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0sharedguiddef.h
guiddef.h
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umocidl.idl
ocidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoleidl.idl
oleidl.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umservprov.idl
servprov.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umurlmon.idl
urlmon.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0ummsxml.idl
msxml.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoleacc.idl
oleacc.idl
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umoaidl.acf
oaidl.acf
Processing C:Program Files (x86)Windows Kits10include10.0.15063.0umocidl.acf
ocidl.acf`

=====================================================

Question:

Initial situation

I made use of the Component Object Model (COM) in the .NET Framework before in order to use my C# class library in Delphi as shown in this YouTube tutorial, which worked surprisingly well. However, I now want to use .NET Core 6 instead.

Following the official tutorial from Microsoft “Expose .NET Core components to COM”, I created this interface

using System.Runtime.InteropServices;

[ComVisible(true)]
[Guid(6775d93d-cf14-42b9-83db-425bac0acf4d)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IServer
{
    public string getHelloWorld();
}

and this class.

using System.Runtime.InteropServices;

[ComVisible(true)]
[Guid(d62bf794-d29e-4fcd-8637-994490264a93)]
public class Server : IServer
{
    public string getHelloWorld()
    {
        return "Hello World";
    }
}

After building the project, I executed this command to register all of my exposed .NET objects with COM.

regsvr32 MyProjectName.comhost.dll

The command executed successfully. I now tried to import the created .dll file in Delphi, like I did before with the class libraries written in .NET Framework (See timestamp of YouTube tutorial). However, Delphi runs into an error because it can’t load the type library.

Edit 1: Godzilla-type breaking change

According to the official documentation…

Unlike in .NET Framework, there is no support in .NET Core or .NET 5+ for generating a COM Type Library (TLB) from a .NET assembly. The guidance is to either manually write an IDL file or a C/C++ header for the native declarations of the COM interfaces. If you decide to write an IDL file, you can compile it with the Visual C++ SDK’s MIDL compiler to produce a TLB.

… there is no support in .NET Core for generating a typelib.

Edit 2: MIDL compiler

However, there is still a way to manually produce a TBL file by using the MIDL compiler. As you can read up in the official documentation, the MIDL compiler processes an IDL file to generate a type library. With that beeing said, I created this IDL file by using this guide.

[
    uuid(a93d03e0-9adf-4a2d-93e3-0ccfc2d8e1a6),
    lcid(0x0409),
    version(1.0),
]
library MyProjectName
{
    importlib("stdole.tlb"); 
    [
        uuid(16292ce5-ccd1-405d-9a70-ace42152bb15),
        oleautomation,
        dual
    ]
    interface IServer: IUnknown {
        HRESULT getHelloWorld([out, string] IServer** string);
    };
};

However, I get an error when I execute the following command to generate the .tlb file.

midl myProjectName.idl /tlb myProjectName.tlb

> midl : command line error MIDL1005 : cannot find C preprocessor cl.exe

Issue: I searched for cl.exe on my Computer but couldn’t find anything.

Q.: Does anybody have an idea on how I could solve my problem? I highly appreciate any kind of help, cheers!

Answer:

If you do not mind switching to a different approach, you can compile a native library from .Net using NativeAOT. You can find an example here

It seems to be planned to be available in .Net 7 but you can already start using it with .Net 6.

If you have better answer, please add a comment about this, thank you!

>
Не могу вызывать ф-и API из Callback ф-и
, Есть Callback функция через AddressOf…

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
18.01.06, 10:57

    Я пользуюсь некой DLL через Declare. Эта DLL требует инициализации с передачей ей (через AddressOf) указателя на мою Callback-функцию (на VB), которую эта DLL будет дергать в неопределенные моменты. Пока все ясно. Проблема в том, что я не могу размещать внутри моей Callback-функции никакие вызовы API-функций — происходит крах. Дополнительно сообщю, что DLL написана не мной на С++, публичные вызовы по StdDecl. Как говорят в KB198607 ( http://support.microsoft.com/kb/q198607/ ), виновата несовместимая реализация потоков. Но решения там нет.

    Вот в сильно упрощенном виде код:

    ExpandedWrap disabled

      ‘ Здесь я объявляю функцию инициализации DLL

      Public Declare Function init_DLL Lib «XXX.dll» (ByVal CallbackFunc As Long) As Long

      ‘ Это типа точка входа

      Public Sub Main()

         ‘ Инициирую DLL с передачей ей указателя на мою Callback-функцию

           init_DLL(AddressOf CallbackFunc)

      End Sub

      ‘ А вот и сама Callback-функция в соответствием с требованием DLL

      Public Function CallbackFunc(ByVal param1 As Long, ByVal param2 As Long) As Long

          ‘ невозможно делать вызовы API-функций

      End Function

    Неуклюжее рабочее решение — поставить таймер, который откладывает выполнение асинхронной функции (вместо нее будет вымолняться другая, синхронная ф.) Но мало того, что это не красиво, моя callback функция не сможет возвращать осмысленного значение, т.к. выход из нее раньше, чем собственно выполнение. Как жить-то дальше?


    вопросы и предложения на кофейно



    Сообщ.
    #2

    ,
    18.01.06, 16:44

      похоже это действительно ваш случай.

      а стандартные вба функции все работают в таком коллбаке?
      если ваш — то не должны бы все. скорее «почти никакие»

      если не ваш случай, то

      может быть этой «XXX.dll» сделать LoadLibrary до вызова init_DLL (?)


      попробуйте нужную апи функцию вызвать предварительно до инициализации внешней библиотеки.
      (или использовать tlb-описатель для задействованных таким образом библиотек)


      если случай все же ваш, и
      ваш VB-код действительно исполняется потоком, который вб не сам для себя создал
      (а очень похоже по сказанному),
      то, как минимум, нужно инициализировать оле для этого ( в этом) потоке и создать вручную однопоточные ком-апартаменты. (с вытекающей потом терминацией поднятого при завершении потока)

      показать как «надо» — не смогу. так не делал никогда. «книжные знания».


      G-Hex



      Сообщ.
      #3

      ,
      18.01.06, 21:35

        Senior Member

        ****

        Рейтинг (т): 30

        Jupiter
        Попробуй другой способ работы с потоками…..


        Jupiter



        Сообщ.
        #4

        ,
        19.01.06, 09:02

          Цитата

          а стандартные вба функции все работают в таком коллбаке?
          если ваш — то не должны бы все. скорее «почти никакие»

          Я могу работать с глобальными и модульными переменными. Вызовы функций VB происходят странно — в основном падает. Даже на On Error GoTo. При этом есть разница, запускаю ли я скомпилированный ехе, или из ide.

          Все описанные здесь рекомендации вызывают у меня ужас. В настоящее время я пишу на С свойю dll-переходник к этой чужой dll в надежде, что оттуда Callback будет работать нормально. Ну а уж свою-то dll со своей же vb-программой я подружить всегда смогу :-) Хотя обидно: я столько преодалел, чтобы заставить эту dll работать непосредственно из-под vb, будь он проклят.


          сразу все



          Сообщ.
          #5

          ,
          19.01.06, 10:14

            советы вызывают ужас?

            значит — написать переходник на си — легче, чем загрузить библиотеку до вызова коллбэк функции?
            вам видней. но коллбек сам по себе от этого вряд ли заработает.

            может, все-таки — попробовать loadlibrary сначала?


            а что вас заставляет вообще мучаться с vb?


            Velin



            Сообщ.
            #6

            ,
            19.01.06, 13:27

              Member

              **

              Рейтинг (т): 8

              2сразу все: А немогли бы Вы описать, каким образом приведенное вами решение позволит «подружить» VB с многопоточностью?


              Jupiter



              Сообщ.
              #7

              ,
              19.01.06, 13:48

                Цитата Velin @ 19.01.06, 13:27

                2сразу все: А немогли бы Вы описать, каким образом приведенное вами решение позволит «подружить» VB с многопоточностью?

                Там решение такое. Сообщения, посылаемые через Callback (а это именно механизм сообщений) помещаются в буфер внутри моей переходной dll. А VB-программа переодически (увы, по таймеру) синхронно опрашивает эту dll. Многопоточность, если она есть, существует между моей и чужой dll-ми, там все на мьютексах, как и положено. А VB ничего об этом не знает. Такой механизм уже много лет работает для другого источника сообщений. Самому мне вся эта кухня с таймерами не очень нравится. Но пока не перейдем на .net, похоже так и будем в муках изобретать (рожать) велосипеды.

                Сообщение отредактировано: Jupiter — 19.01.06, 13:50


                сразу все



                Сообщ.
                #8

                ,
                19.01.06, 15:37

                  2 Vellin
                  если вы о loadlibrary, то:

                  пока нет ясных оснований считать, что дело именно в многопоточности.
                  пока ясно, что загрузка (и инициализация) dll происходит в момент первого обращения
                  к объявленной через декларе функции. И «предложение» заключается просто в разведении загрузки и инициализации длл от первого обращения к ней за исполнением функции.
                  Это единственное, что я могу определенно вынести непосредственно из первоначально сказанного.

                  Из продолжения может возникать подозрение, что идет какое-то косвенное субклассирование чужого окна. Но чего-то внятного сказать нельзя.
                  Предположение о том, что эта длл передает «чужому» уже существующему на момент передачи потоку адрес функции, которая потом должна быть быполнена в том другом потоке — тоже вполне возможно. и слова некоторые на эту мысль наводят. Если да — то далее идут слова про исполнение вб кода в «чужих» потоках, которые не были созданы системой поддержки исполнения вб-кода.
                  Однако, если нет информации и инструменария понять, что в точности происходит, то идти надо от простых предположений.

                  (так я думаю)
                  :)

                  Guru

                  SCINER



                  Сообщ.
                  #9

                  ,
                  19.01.06, 16:00

                    Moderator

                    *******

                    Рейтинг (т): 228

                    а вы не пробовали вызывать API функции динамически, т.е. без ее предварительной декларации ?


                    сразу все



                    Сообщ.
                    #10

                    ,
                    19.01.06, 16:13

                      как связано с дружением с многопоточностью:

                      Цитата

                      попробуйте нужную апи функцию вызвать предварительно до инициализации внешней библиотеки.

                      само по себе это мимо кассы. поторопился.

                      Цитата

                      (или использовать tlb-описатель для задействованных таким образом библиотек)

                      это позволит иметь «нормально» построенный вызов апи функции. адрес которой гарантированно известен (на этапе компиляции) в момент вызова. а нужная длл будет
                      гарантирована загружена в адресное простанство программы в момент старта (загрузки).
                      Код вызова апи функции полностью сформирован и не требует поддержки времени выполнения.
                      все имеет хорошие шансы срастись. чужой поток будет иметь дело с кодом не требующим поддержки в момент вызова от среды вб. есть шансы, что все срастется.

                      Цитата

                      если случай все же ваш, и
                      ваш VB-код действительно исполняется потоком, который вб не сам для себя создал
                      (а очень похоже по сказанному),
                      то, как минимум, нужно инициализировать оле для этого ( в этом) потоке

                      вб почти 100-процентно полагается на ком. почти все (по крайней мере — все видимые в просмотрщике объектов) функции вб не будут работать, если в исполняющем потоке не инициализирован ком.
                      единственный шанс получить минимально способный к выполнению относительно сложного вб-кода не вб поток — инициализировать в этом потоке ком (типа — олеинитиалайз)

                      Цитата

                      и создать вручную однопоточные ком-апартаменты. (с вытекающей потом терминацией поднятого при завершении потока)

                      так делает сам вб для каждого «своего» потока. говорят, «в принципе» это можно обойти. но лучше следовать его примеру.

                      Цитата

                      показать как «надо» — не смогу. так не делал никогда. «книжные знания».

                      тут вроде пояснять нечего. я — не делал.


                      сразу все



                      Сообщ.
                      #11

                      ,
                      19.01.06, 16:19

                        2 SCINER

                        про динамический вызов.

                        очень может даже быть что прокатит. нужно только придумать какой-то надежный механизм сохранения параметров вызова для вызывающей процедуры. где-нибудь в атомах и/или оконных лонгах.

                        думаю, что это «потребует кодирования». и как по мне — лучше уж описатель прикрутить.


                        сразу все



                        Сообщ.
                        #12

                        ,
                        19.01.06, 16:42

                          еще про динамический вызов.
                          думаю, что так или иначе, код динамического вызова
                          (задействованных в вызове апи-функций) надо строить на tlb.


                          Velin



                          Сообщ.
                          #13

                          ,
                          19.01.06, 19:42

                            Member

                            **

                            Рейтинг (т): 8

                            Цитата

                            пока нет ясных оснований считать, что дело именно в многопоточности

                            По Вашему http://support.microsoft.com/kb/q198607/ это не основание?


                            Victosha



                            Сообщ.
                            #14

                            ,
                            19.01.06, 20:00

                              не основание для чего? я не понял, на какое именно место в статье вы хотите точно указать.

                              если на это:

                              Цитата

                              This error may occur immediately following a declared API function call within a Visual Basic callback function

                              то я вроде по русски говорю —
                              попробуйте использовать tlb-описатели.

                              и более того — если неизвестно, кто и как создавал тот внешний поток, то никто не обещал не только работоспособности декларированных апи (требующих поддержки времени исполнения), но и «обычного» вб-шного кода.

                              кстати, когда я говорил про предварительный вызов до регистрации функции косвенного выполнения, то думал в первую очередь о том, что в данном конкретном случае совсем не обязательно речь идет о «чужом потоке», а,
                              вполне возможно, об особенностях инициализации конкретной xxx
                              И без всяких потоков бывает, что принудительная предварительная загрузка целевой dll стабилизирует работу декларированных функций.

                              если вы еще раз прочитаете статью, на которую сослались, то увидите, что ни в каком предложении она не входит в противоречие с моими утверждениями.
                              (даже если какие-то из них и окажутся неточными — статья своим текстом их непосредственно не опровергает)
                              :)


                              Jupiter



                              Сообщ.
                              #15

                              ,
                              20.01.06, 07:57

                                >попробуйте использовать tlb-описатели.

                                Я бы с удовольствием попробовал. Вы только намекните, как именно…
                                В смысле, о чем идет речь в терминах синтаксиса VB?

                                Сообщение отредактировано: Jupiter — 20.01.06, 07:58


                                Victosha



                                Сообщ.
                                #16

                                ,
                                20.01.06, 08:05

                                  я не понял последнего предложения.

                                  давайте так:
                                  выложите полные точные декларации для ваших функций в проблемной длл
                                  и использованных в функции косвенного вызова апи.
                                  если их не слишком много окажется (типа — 3-4) выложу вам сегодня описатель.
                                  просто закомментируете в проекте свои декларации и подключите описатель


                                  Victosha



                                  Сообщ.
                                  #17

                                  ,
                                  20.01.06, 09:06

                                    tlb описатель — это библиотека типов. Подключается в прект в References
                                    возьми здесь достаточно полные описатели апи-функций как анси WinTlb3.zip

                                    так и юникод WinTlbU.zip версий апи-функций.

                                    mckinney


                                    Jupiter



                                    Сообщ.
                                    #18

                                    ,
                                    20.01.06, 09:15

                                      Попробовал выводить значение GetCurrentThreadID в sub Main и в Callback функции. Они ОТЛИЧАЮТСЯ.

                                      Вот код моей программы на VB

                                      ExpandedWrap disabled

                                        ‘ Здесь я объявляю функцию инициализации DLL

                                        Public Declare Function init_DLL Lib «XXX.dll» (ByVal CallbackFunc As Long) As Long

                                        ‘ А вот «крутая» функция API.

                                        Private Declare Function Beep Lib «kernel32» (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

                                        ‘ Это типа точка входа

                                        Public Sub Main()

                                           ‘ Инициирую DLL с передачей ей указателя на мою Callback-функцию

                                             init_DLL(AddressOf CallbackFunc)

                                        End Sub

                                        ‘ А вот и сама Callback-функция в соответствием с требованием DLL

                                        Public Function CallbackFunc(ByVal param1 As Long, ByVal param2 As Long) As Long

                                            Beep 1000, 500 ‘ Бу-бух… Упали…

                                        End Function

                                      Вот описания на C из чужой документации. Инициализация (init_DLL) происходит нормально.

                                      ExpandedWrap disabled

                                        DWORD init_DLL (VLSDK_CALLBACK* callback);

                                        // Прототип функции обратного вызова

                                        typedef int (__stdcall VLSDK_CALLBACK)(DWORD param1, DWORD param2);


                                      Алиса



                                      Сообщ.
                                      #19

                                      ,
                                      20.01.06, 09:15

                                        Алиса Senior Member

                                        ****

                                        Рейтинг (т): 58

                                        Цитата Jupiter @ 19.01.06, 09:02

                                        Вызовы функций VB происходят странно — в основном падает. Даже на On Error GoTo.

                                        ловить надо с помощью SetUnhandledExceptionFilter

                                        см. пример ее использования.

                                        Сообщение отредактировано: Алиса — 20.01.06, 09:30


                                        Прикреплённый файлПрикреплённый файлCode_Exception.rar (3.87 Кбайт, скачиваний: 51)


                                        Jupiter



                                        Сообщ.
                                        #20

                                        ,
                                        20.01.06, 09:48

                                          Цитата , @ 12.01.70, 11:05

                                          tlb описатель — это библиотека типов. Подключается в прект в References
                                          возьми здесь достаточно полные описатели апи-функций как анси WinTlb3.zip

                                          так и юникод WinTlbU.zip версий апи-функций.

                                          mckinney

                                          Спасибо, я скачал. Я понял, в каком направлении все должно крутиться.
                                          Чтобы получить требуемый win.tlb я должен запустить некий батник. Не люблю я эти батники: они вечно что-нибудь требуют. Вот и в этот раз:
                                          >midl : command line error MIDL1005 : cannot find C preprocessor cl.exe
                                          Может быть у Вас есть win.tlb?


                                          Victosha



                                          Сообщ.
                                          #21

                                          ,
                                          20.01.06, 10:25

                                            файл больше 200 кб размером — прилепить не могу.
                                            где-то он лежал в скомпилированном виде — или на вбакселераторе или на сайте у Петерсона.

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


                                            Victosha



                                            Сообщ.
                                            #22

                                            ,
                                            20.01.06, 11:15

                                              вот маленький описатель
                                              там только бип
                                              и попытка описать вашу функцию инициализации.

                                              подключите библиотеку
                                              попробуйте сначала закомментировать в своем коде только декларацию бип
                                              проверьте, что работает библиотечной описатель в обычной процедурею
                                              дальше попробуйте запустить в «рабочем» режиме.

                                              попробуйте также закомментировать в свем коде объявление init_DLl.
                                              если объявление в библиотеке составлено неверно, то скомпилированный проект не запустится и дело до точки вызова init_dll не дойдет

                                              Прикреплённый файлПрикреплённый файлBeep.tlb (1.52 Кбайт, скачиваний: 193)


                                              Victosha



                                              Сообщ.
                                              #23

                                              ,
                                              20.01.06, 11:16

                                                вот маленький описатель
                                                там только бип
                                                и попытка описать вашу функцию инициализации.

                                                подключите библиотеку
                                                попробуйте сначала закомментировать в своем коде только декларацию бип
                                                проверьте, что работает библиотечной описатель в обычной процедурею
                                                дальше попробуйте запустить в «рабочем» режиме.

                                                попробуйте также закомментировать в свем коде объявление init_DLl.
                                                если объявление в библиотеке составлено неверно, то скомпилированный проект не запустится и дело до точки вызова init_dll не дойдет

                                                Прикреплённый файлПрикреплённый файлBeep.tlb (1.52 Кбайт, скачиваний: 218)


                                                Jupiter



                                                Сообщ.
                                                #24

                                                ,
                                                23.01.06, 09:16

                                                  Цитата Victosha @ 20.01.06, 11:15

                                                  вот маленький описатель
                                                  там только бип
                                                  и попытка описать вашу функцию инициализации.

                                                  Спасио. Эксперимент состоялся. Но утишительного мало.
                                                  Действительно, Beep удалось запустить по Вашей схеме. Но из Callback он все равно падает :-(
                                                  Инициировать длл с помощью даного описателя, к сожалению, невозможно, т.к. для упрощения разговора я опустил еще один аргумент (long), да и имя функции дал более понятное для обсуждения. То есть, если бы я знал, что Вы следаете описание на idl, то конечно бы дал полное описание ф-и инициализации. Все равно, спасибо за поддержку! Буду писать переходник.

                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                                  0 пользователей:

                                                  • Предыдущая тема
                                                  • Visual Basic: Общие вопросы
                                                  • Следующая тема

                                                  [ Script execution time: 0,0590 ]   [ 16 queries used ]   [ Generated: 9.02.23, 21:38 GMT ]  

                                                  Понравилась статья? Поделить с друзьями:
                                                • Midea стиральная машина ошибка e30
                                                • Midea посудомоечная машина мини ошибка е1
                                                • Midea коды ошибок духовых шкафов
                                                • Midea vcr16 ошибка l001
                                                • Midea mid60s110 ошибки