
BG Development · За реклама · За контакти |
![]() ![]() ![]() ![]() ![]() |
Здравей! ( Включване | Регистриране ) |
![]() ![]() ![]() |
ivayleto |
Публикувано на: 24-02-2022, 17:30
|
Име: Ивайло Илиев Група: Потребител Ранг: Новопостъпил Мнения: 2 Регистриран на: 24.02.22 ![]() |
Здравейте, може ли помощ отнотно файлът. Опитах да го подкарам на 64 битов Ексел, но не се получава. Смених дефинициите с PtrSafe, но пак нищо не се получи. Опитах да променя Long->LongPtr, "Type mismatch". Засега стигам до това да се стартира формата с менютата, но когато се избере меню нищо не се случва, а трябва да се появи съответния месидж. На 32 бита ексел върви без проблем. но искам да го използвам и на 64 бита и на 32.
Моля за помощ! Прикачен файл ( Брой сваляния: 30 ) ![]() |
ici |
Публикувано на: 24-02-2022, 19:45
|
![]() ![]() Име: Ивайло Илчев Група: VIP Ранг: Почетен член Мнения: 17876 Регистриран на: 06.06.04 ![]() |
Сложи кода тук във [ CODE ] секция, без интервалите.
-------------------- Ние не сме в една лодка, ние сме в една буря. Лодките са различни.
Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп. |
Антон Яначков |
Публикувано на: 24-02-2022, 19:53
|
Име: Антон Яначков Група: Потребител Ранг: Почетен член Мнения: 2622 Регистриран на: 27.07.16 ![]() |
Използвай този шаблон за деклариране на АПИ функциите и всичко ще се оправи.
Един и същ файл ще работи безпроблемно и на 32 и на 64 битова машина. ПРИМЕР: #If VBA7 Then 'Декларираме АПИ функция за 64 битова машина за изпращане фокуса в прозорец с известен hwnd Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As LongPtr 'Декларираме АПИ функция за 64 битова машина за извеждане на прозорец най-отгоре с известен hwnd Public Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal hwnd As LongPtr) As LongPtr '.....И така нататък за всички АПИ функции, а също и разни променливи или константи, които подаваш на функциите #Else 'Декларираме АПИ функция за 32 битова машина за изпращане фокуса в прозорец с известен hwnd Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 'Декларираме АПИ функция за 32 битова машина за извеждане на прозорец най-отгоре с известен hwnd Public Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long #End If Това, което си написал за показване на формата е ненужно: #If VBA6 Then '// A drawback to this method is '// you CANNOT use vbModeless.... '// I'm working on this. frmTask.Show #Else Sorry #End If Това е елементарен стандартен метод Show и той работи и се пише по един и същи начин. И на 32 битова машина и на 64 битова е достатъчно да напишеш: frmTask.Show Но при процедурата за инициализация Private Sub UserForm_Initialize() имаш извикване на процедура Call CreateAPIMenu, която сигурно използва някоя АПИ функция и ако намяш декларация на използваните АПИ за двата вида машини, ще срине програмата. Сега Внимавай! Ако тръгнеш да налучкваш декларацията за 64 битова машина, като просто подменяш примерно Long с LongPrt и Declare c Declare PtrSafe, то вероятността да сгрешиш е голяма. Търсиш точната декларация на всяка една API функция в интернет и не забравяш, че тя пък работи с променливи, които също могат да бъдат от различен тип и трябва да ги декларираш също по различен начин. |
ivayleto |
Публикувано на: 25-02-2022, 10:18
|
||
Име: Ивайло Илиев Група: Потребител Ранг: Новопостъпил Мнения: 2 Регистриран на: 24.02.22 ![]() |
Здравейте, благодаря за насоките. Направих всичко както ме насочихте, дефинирах Api функциите за 32 и 64 бита (поне така мисля). Узерформата се компилира но когато стигне до [CODE]g_lpMyWndProc = SetWindowLongPtr(g_hForm, GWL_WNDPROC, AddressOf HookWinProc)[CODE] стойността му става 140712738041436^, формата не се зарежда, а точно обратното ексел се затваря. Може ли да погледнете и да ме насочите, защо се получава така. Благодаря Ви предварително. Това мнение е било редактирано от ivayleto на 25-02-2022, 10:19 Прикачен файл ( Брой сваляния: 38 ) ![]() |
||
![]() |
![]() ![]() ![]() |