Всем доброго времени суток.
Имеется некоторая 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 вручную. Это же разовая операция.
Содержание
- Scons source cannot find C preprocessor cl.exe Windows 10 #7170
- Comments
- Midl command line error midl1005 cannot find c preprocessor cl exe
- Лучший отвечающий
- Вопрос
- Ответы
- Midl command line error midl1005 cannot find c preprocessor cl exe
- Answered by:
- Question
- Answers
- Midl command line error midl1005 cannot find c preprocessor cl exe
- Answered by:
- Question
- Answers
- Midl command line error midl1005 cannot find c preprocessor cl exe
- Answered by:
- Question
- 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…
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Я пользуюсь некой DLL через Declare. Эта DLL требует инициализации с передачей ей (через AddressOf) указателя на мою Callback-функцию (на VB), которую эта DLL будет дергать в неопределенные моменты. Пока все ясно. Проблема в том, что я не могу размещать внутри моей Callback-функции никакие вызовы API-функций — происходит крах. Дополнительно сообщю, что DLL написана не мной на С++, публичные вызовы по StdDecl. Как говорят в KB198607 ( http://support.microsoft.com/kb/q198607/ ), виновата несовместимая реализация потоков. Но решения там нет. Вот в сильно упрощенном виде код:
‘ Здесь я объявляю функцию инициализации 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 функция не сможет возвращать осмысленного значение, т.к. выход из нее раньше, чем собственно выполнение. Как жить-то дальше? |
вопросы и предложения на кофейно |
|
похоже это действительно ваш случай. а стандартные вба функции все работают в таком коллбаке? если не ваш случай, то может быть этой «XXX.dll» сделать LoadLibrary до вызова init_DLL (?) … … показать как «надо» — не смогу. так не делал никогда. «книжные знания». |
G-Hex |
|
Senior Member Рейтинг (т): 30 |
Jupiter |
Jupiter |
|
Цитата
а стандартные вба функции все работают в таком коллбаке? Я могу работать с глобальными и модульными переменными. Вызовы функций VB происходят странно — в основном падает. Даже на On Error GoTo. При этом есть разница, запускаю ли я скомпилированный ехе, или из ide. Все описанные здесь рекомендации вызывают у меня ужас. В настоящее время я пишу на С свойю dll-переходник к этой чужой dll в надежде, что оттуда Callback будет работать нормально. Ну а уж свою-то dll со своей же vb-программой я подружить всегда смогу Хотя обидно: я столько преодалел, чтобы заставить эту dll работать непосредственно из-под vb, будь он проклят. |
сразу все |
|
советы вызывают ужас? значит — написать переходник на си — легче, чем загрузить библиотеку до вызова коллбэк функции? может, все-таки — попробовать loadlibrary сначала? — |
Velin |
|
Member Рейтинг (т): 8 |
2сразу все: А немогли бы Вы описать, каким образом приведенное вами решение позволит «подружить» VB с многопоточностью? |
Jupiter |
|
Цитата Velin @ 19.01.06, 13:27 2сразу все: А немогли бы Вы описать, каким образом приведенное вами решение позволит «подружить» VB с многопоточностью? Там решение такое. Сообщения, посылаемые через Callback (а это именно механизм сообщений) помещаются в буфер внутри моей переходной dll. А VB-программа переодически (увы, по таймеру) синхронно опрашивает эту dll. Многопоточность, если она есть, существует между моей и чужой dll-ми, там все на мьютексах, как и положено. А VB ничего об этом не знает. Такой механизм уже много лет работает для другого источника сообщений. Самому мне вся эта кухня с таймерами не очень нравится. Но пока не перейдем на .net, похоже так и будем в муках изобретать (рожать) велосипеды. Сообщение отредактировано: Jupiter — 19.01.06, 13:50 |
сразу все |
|
2 Vellin пока нет ясных оснований считать, что дело именно в многопоточности. Из продолжения может возникать подозрение, что идет какое-то косвенное субклассирование чужого окна. Но чего-то внятного сказать нельзя. (так я думаю) |
SCINER |
|
Moderator Рейтинг (т): 228 |
а вы не пробовали вызывать API функции динамически, т.е. без ее предварительной декларации ? |
сразу все |
|
как связано с дружением с многопоточностью: Цитата попробуйте нужную апи функцию вызвать предварительно до инициализации внешней библиотеки. само по себе это мимо кассы. поторопился. Цитата (или использовать tlb-описатель для задействованных таким образом библиотек)
это позволит иметь «нормально» построенный вызов апи функции. адрес которой гарантированно известен (на этапе компиляции) в момент вызова. а нужная длл будет Цитата
если случай все же ваш, и вб почти 100-процентно полагается на ком. почти все (по крайней мере — все видимые в просмотрщике объектов) функции вб не будут работать, если в исполняющем потоке не инициализирован ком. Цитата и создать вручную однопоточные ком-апартаменты. (с вытекающей потом терминацией поднятого при завершении потока) так делает сам вб для каждого «своего» потока. говорят, «в принципе» это можно обойти. но лучше следовать его примеру. Цитата показать как «надо» — не смогу. так не делал никогда. «книжные знания». тут вроде пояснять нечего. я — не делал. |
сразу все |
|
2 SCINER про динамический вызов. очень может даже быть что прокатит. нужно только придумать какой-то надежный механизм сохранения параметров вызова для вызывающей процедуры. где-нибудь в атомах и/или оконных лонгах. думаю, что это «потребует кодирования». и как по мне — лучше уж описатель прикрутить. |
сразу все |
|
еще про динамический вызов. |
Velin |
|
Member Рейтинг (т): 8 |
Цитата пока нет ясных оснований считать, что дело именно в многопоточности По Вашему http://support.microsoft.com/kb/q198607/ это не основание? |
Victosha |
|
не основание для чего? я не понял, на какое именно место в статье вы хотите точно указать. если на это: Цитата This error may occur immediately following a declared API function call within a Visual Basic callback function то я вроде по русски говорю — и более того — если неизвестно, кто и как создавал тот внешний поток, то никто не обещал не только работоспособности декларированных апи (требующих поддержки времени исполнения), но и «обычного» вб-шного кода. кстати, когда я говорил про предварительный вызов до регистрации функции косвенного выполнения, то думал в первую очередь о том, что в данном конкретном случае совсем не обязательно речь идет о «чужом потоке», а, если вы еще раз прочитаете статью, на которую сослались, то увидите, что ни в каком предложении она не входит в противоречие с моими утверждениями. |
Jupiter |
|
>попробуйте использовать tlb-описатели. Я бы с удовольствием попробовал. Вы только намекните, как именно… Сообщение отредактировано: Jupiter — 20.01.06, 07:58 |
Victosha |
|
я не понял последнего предложения. давайте так: |
Victosha |
|
tlb описатель — это библиотека типов. Подключается в прект в References так и юникод WinTlbU.zip версий апи-функций. mckinney |
Jupiter |
|
Попробовал выводить значение GetCurrentThreadID в sub Main и в Callback функции. Они ОТЛИЧАЮТСЯ. Вот код моей программы на VB
‘ Здесь я объявляю функцию инициализации 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) происходит нормально.
DWORD init_DLL (VLSDK_CALLBACK* callback); // Прототип функции обратного вызова typedef int (__stdcall VLSDK_CALLBACK)(DWORD param1, DWORD param2); |
Алиса |
|
Senior Member Рейтинг (т): 58 |
Цитата Jupiter @ 19.01.06, 09:02 Вызовы функций VB происходят странно — в основном падает. Даже на On Error GoTo. ловить надо с помощью SetUnhandledExceptionFilter см. пример ее использования. Сообщение отредактировано: Алиса — 20.01.06, 09:30
|
Jupiter |
|
Цитата , @ 12.01.70, 11:05 tlb описатель — это библиотека типов. Подключается в прект в References так и юникод WinTlbU.zip версий апи-функций. mckinney
Спасибо, я скачал. Я понял, в каком направлении все должно крутиться. |
Victosha |
|
файл больше 200 кб размером — прилепить не могу. по всему — из чужого потока вызов происходит. |
Victosha |
|
вот маленький описатель подключите библиотеку попробуйте также закомментировать в свем коде объявление init_DLl. |
Victosha |
|
вот маленький описатель подключите библиотеку попробуйте также закомментировать в свем коде объявление init_DLl. |
Jupiter |
|
Цитата Victosha @ 20.01.06, 11:15 вот маленький описатель
Спасио. Эксперимент состоялся. Но утишительного мало. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Visual Basic: Общие вопросы
- Следующая тема
[ Script execution time: 0,0590 ] [ 16 queries used ] [ Generated: 9.02.23, 21:38 GMT ]