PDA

View Full Version : پیام خطا در انتقال برنامه به سیستم دیگر



iransim
یک شنبه 03 اردیبهشت 1396, 14:38 عصر
سلام دوستان
من برنامه ام رو روی لپ تاپ منزل با ویندوز 10 طراحی کردم و درهنگام اجرا مشکلی ندارم ولی وقتی فایل برنامه رو به سیستم اداره منتقل کردم هر فرم یا گزارش یا کوئری رو اجرا میکنم این پیام خطا رو از ماژولها میگیرد
لطفا بفرمائید چگونه رفع عیب کنم ؟ ممنون از همه

Ali_Fallah
یک شنبه 03 اردیبهشت 1396, 20:06 عصر
این بر میگرده به اینکه شما برنامه تون رو در سیستم 64 بیت طراحی کرده و در سیستم 32بیت میخواهید اجراش کنید که نمیشه ...

iransim
سه شنبه 05 اردیبهشت 1396, 10:43 صبح
ممنون دوست عزیز ولی چک کردم هر دو سیستم 64 بیتی هستند

e601
شنبه 09 اردیبهشت 1396, 14:52 عصر
ممنون دوست عزیز ولی چک کردم هر دو سیستم 64 بیتی هستند

ببینید ما علاوه بر اینکه ویندوز 64 بیت و 32 بیت داریم، آفیس 64 بیت و 32 بیت هم داریم که جدا از بحث ویندوز هست. شما کدتون رو در سیستم اول با آفیس 32 بیتی نوشتید ولی آفیس شما در سیستم دوم نسخه ی 64 بیتی هست.

برای استفاده از دستورات API ویندوز در نسخه 64 بیتی باید کلیدواژه ی PtrSafe رو بعد از Declare اضافه کنید:

Private Declare PtrSafe Function...

iransim
شنبه 09 اردیبهشت 1396, 23:27 عصر
دوست عزیز ممنون از جوابتون
امکانش هست بیشتر توضیح بدهید ؟ یعنی کجای برنامه رو باید اصلاح کنیم ؟
باید دوباره برنامه رو یه سیستم و افیس 64 پیاده و طراحی کنم ؟ ( البته خدا نکنه )
اگه نسخه افیس سیستم اول رو به 64 تغییر بدم مشکل حل میشه ؟

e601
یک شنبه 10 اردیبهشت 1396, 16:12 عصر
این قضیه فقط مربوط به زمانیست که شما از کدهای API ویندوز استفاده میکنید که در این مواقع در آفیسهای 64 بیتی باید کلیدواژه ی PtrSafe رو به دستورتون اضافه کنید. اگر از API استفاده نکنید تفاوتی در طراحی برنامه با آفیس 32 بیتی و 64 بیتی وجود نداره.

مثلا فراخوانی یک تابع نمونه در آفیس 32 بیتی دستور به صورت زیر نوشته میشه:

Public Declare Sub MessageBeep Lib "User32" (ByVal N As Long)

ولی همون تابع در آفیس 64 بیتی باید بصورت زیر فراخوانی بشه:

Public Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal N As Long)

شما 2 راه حل دارید:
1. فقط در مواقع خیلی ضروری از کدهای API استفاده کنید و اگر عملکرد خیلی حیاتی نداره ازش استفاده نکنید.
2. از کامپایل شرطی استفاده کنید. بصورت زیر: (علامت هشتگ باید اول خط باشه)

#If VBA7 Then
Public Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal N As Long)
#Else
Public Declare Sub MessageBeep Lib "User32" (ByVal N As Long)
#End If

توضیح: VBA7 یک const (ثابت) داخلی اکسس هست که بیانگر 64 بیتی بودن آفیس هست

برای چک کردن ویندوز 64 یا 32 بیتی هم میتونید از ثابت Win64 استفاده کنید:

#If Win64 Then
Declare PtrSafe Function ...
#Else
Declare Function ...
#End If

iransim
یک شنبه 10 اردیبهشت 1396, 21:46 عصر
خیلی خیلی ممنونم دوست عزیز
اگه بازم سئوالی بود مزاحم میشم