פונקציית StrPtr עושה בעיות ב 64 ביט
-
תנסה כך:
CLong(StrPtr(UTF16))
זה לא עובד כי הAPI לא מכיר את הפונקציה הזאת של CLong הודעת שגיאה.
@רחמיםויש גם את זה:
http://support.microsoft.com/kb/983246אין שם שורת קוד אחת של פתרון, אני לא מצליח להבין מה כתוב שם... :? :? :?
פורסם במקור בפורום CODE613 ב12/02/2014 15:17 (+02:00)
-
כנראה זה מה שמותקן לו (לארכיטקט) במחשב.
אתה רוצה שהוא יתקין 32 רק בשביל זה או אולי מכונה ורטואלית. רק בשביל להחליף utf16 ל utf8 .אני לא מאמין שזו הסיבה. (כי אם כן אז הוא מחייב את כלל הלקוחות שלו להיות ב64 ביט ולא נראה לי שזה המצב [יותר אני מאמין שזה הפוך - שיש לו לקוח עם 64 ביט])
אבל למה רק ארכיטקט? יש כאן בפורום דוגמא למישהו שמתחזק 2 גירסאות 32 ו64...פורסם במקור בפורום CODE613 ב12/02/2014 18:23 (+02:00)
-
ארכיטקט, סליחה על הבורות.
מה הסיבה להשתמש ב64 ביט?
יותר טוב, או סתם בגלל שזה מה שמותקן אצל הלקוח?
זה שווה את ניהול 2 הגירסאות? (אפילו שזה לא בקוד אלא בMDE)נמאס לי להגיד ללקוחות מה להתקין ומה לא וכולי. מבחינת "ניהול" 2 גירסאות, לא נראה לי שיש כל כך בעיה חוץ מפונקציות API שעושים עם תנאי.
לפעמים הם מפרמטים את המחשב, ואז הטכנאי מתקין להם אופיס עוד פעם ואז שוב פעם מתקשרים שהתוכנה לא עובדת וכו' אין לי כוח לזה. אז עדיף לי להחזיק 2 גרסאות ברמת הקימפול בלבד וזהו.
אגב אם מישהו הצליח להבין את המאמרים המצורפים ופשוט להעלות קוד שיפתור את הבעיה, יזכה בפרס שהוא קוד VBA להשלמה אוטומטית של כל הערים והרחובות מדואר ישראל כולל מיקוד חדש בן 7 ספרות...... אם ירצה נתרום את הקוד לקהילה כאן.פורסם במקור בפורום CODE613 ב12/02/2014 18:39 (+02:00)
-
@דוד ל.ט.
ארכיטקט, ניסית את הLongPtr?
אוי ואבוי לי לא הבנתי את התשובה שלך מקודם, ושמתי את הערך במקום הלא נכון!!! עכשיו זה הסתדר ותודה רבה.
עכשיו נוצרה לי בעיה אחרת בעקבות ההמרה, אבל ככל הנראה לא קשור לאשכול הזה.
לגבי הפרס תחליט אתה, זאת שאלה מוסרית, מה הדין אם מבטיחים פרס אחרי שכבר מצאו את בן לאדן....... :lol: :lol: :lol: :lol:
פורסם במקור בפורום CODE613 ב12/02/2014 18:56 (+02:00)
-
@ClickOne
ארכיטקט, סליחה על הבורות.מה הסיבה להשתמש ב64 ביט?
יותר טוב, או סתם בגלל שזה מה שמותקן אצל הלקוח?
זה שווה את ניהול 2 הגירסאות? (אפילו שזה לא בקוד אלא בMDE)נמאס לי להגיד ללקוחות מה להתקין ומה לא וכולי. מבחינת "ניהול" 2 גירסאות, לא נראה לי שיש כל כך בעיה חוץ מפונקציות API שעושים עם תנאי.
לפעמים הם מפרמטים את המחשב, ואז הטכנאי מתקין להם אופיס עוד פעם ואז שוב פעם מתקשרים שהתוכנה לא עובדת וכו' אין לי כוח לזה. אז עדיף לי להחזיק 2 גרסאות ברמת הקימפול בלבד וזהו.
אגב אם מישהו הצליח להבין את המאמרים המצורפים ופשוט להעלות קוד שיפתור את הבעיה, יזכה בפרס שהוא קוד VBA להשלמה אוטומטית של כל הערים והרחובות מדואר ישראל כולל מיקוד חדש בן 7 ספרות...... אם ירצה נתרום את הקוד לקהילה כאן.הייתי מאד שמח לעזור ולנסות.... (לא ע"מ לקבל פרס :lol: )
אבל אין לי 64 ביט....
מה זה קוד השלמה אוטו' של כל הערים וכו?
אתה מתכוון לזה?
ובמיקוד לזה?אם תרצה, אני ישמח להעלות קובץ רחובות וערים של רשות הדואר, מהתקופה שהוא היה נותן בחינם את מה שחברות אחרות היו מוכרות בכסף <!-- s8-) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8-)" title="מגניב" /><!-- s8-) --> , שם יש לכל רחוב ויישוב גם את כל ההטיות והשמות הנרדפים שלו. (לדוגמא: פ"ת, פתח תקווה, פתח תקוה) וכו' -- אבל זה קובץ מעט מיושן - עדכני ללפני שנתיים בערך
עריכה: כבר נפתר.... ברכות לזוכה המאושר!!
פורסם במקור בפורום CODE613 ב12/02/2014 19:04 (+02:00)
-
טוב קודם כל נפתר לא ממש, כי הדיבוג עובר, אבל בסופו של יום הפונקציה לא מחזירה לי כל ערך, אני אציג את הקוד שעשיתי:
Private Const CP_UTF8 = 65001 #If VBA7 Then Private Declare PtrSafe Function WideCharToMultiByte Lib "Kernel32" ( _ ByVal CodePage As LongPtr, ByVal dwflags As LongPtr, _ ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As LongPtr, _ ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As LongPtr, _ ByVal lpDefaultChar As LongPtr, ByVal lpUsedDefaultChar As LongPtr) As Long #Else Private Declare Function WideCharToMultiByte Lib "Kernel32" ( _ ByVal CodePage As Long, ByVal dwflags As Long, _ ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long #End If Public Function UTF16To8(ByVal UTF16 As String) As String 'עקב שגיאה ב 64 ביט יש להשבית את הפונקציה בשלב זה Dim lLength As Long If UTF16 <> "" Then lLength = WideCharToMultiByte(CP_UTF8, 0, StrPtr(UTF16), -1, 0, 0, 0, 0) sBuffer = space$(lLength) lLength = WideCharToMultiByte(CP_UTF8, 0, StrPtr(UTF16), -1, StrPtr(sBuffer), Len(sBuffer), 0, 0) sBuffer = StrConv(sBuffer, vbUnicode) UTF16To8 = Left$(sBuffer, lLength - 1) Else UTF16To8 = "" End If End Function Public Function URLEncode( _ StringVal As String, _ Optional SpaceAsPlus As Boolean = False, _ Optional UTF8Encode As Boolean = True _ ) As String Dim StringValCopy As String: StringValCopy = IIf(UTF8Encode, UTF16To8(StringVal), StringVal) Dim StringLen As Long: StringLen = Len(StringValCopy) If StringLen > 0 Then ReDim result(StringLen) As String Dim i As Long, CharCode As Integer Dim char As String, space As String If SpaceAsPlus Then space = "+" Else space = "%20" For i = 1 To StringLen char = Mid$(StringValCopy, i, 1) CharCode = Asc(char) Select Case CharCode Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126 result(i) = char Case 32 result(i) = space Case 0 To 15 result(i) = "%0" & Hex(CharCode) Case Else result(i) = "%" & Hex(CharCode) End Select Next i URLEncode = Join(result, "") End If End Function
אז הפונקציה URLEncode לא מחזירה לי כל ערך.
מה זה קוד השלמה אוטו' של כל הערים וכו?
אתה מתכוון לזה?לא! זה קובץ XML שלוקח לו שבוע לעלות ושוקל המון, אתה צריך להחזיק אותו אצל הלקוח, בקיצור לא יעיל בעליל. אני מדבר על קוד שמתקשר אונליין עם השרת של דואר ישראל, ומושך ממנו מידע של השלמה אוטומטית, של ערים, ולאחר מכן של הרחובות באותה עיר, אבל אני לא ימרה את פיו של מנהל הפורום.
לגבי עידוד שימוש באקסס, אני מצהיר בזאת שאני משתמש בזה מתוך אילוץ גמור, הואיל ואני כרגע מתפרנס מזה, אבל אני בתהליך של הגירה, יעיד כל כך מג'יקוד...
בכל אופן אני עדיין לא יכול לסמן את הבעיה כנפתרה, כל עוד הפונקציה URLEncode לא מחזירה לי כל ערך..
פורסם במקור בפורום CODE613 ב12/02/2014 19:18 (+02:00)
-
#If VBA7 Then
Private Declare PtrSafe Function WideCharToMultiByte Lib "Kernel32" ( _
ByVal CodePage As LongPtr, ByVal dwflags As LongPtr, _
ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As LongPtr, _
ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As LongPtr, _
ByVal lpDefaultChar As LongPtr, ByVal lpUsedDefaultChar As LongPtr) As Longלא החלפת את הלונג האחרון ל LongPtr
פורסם במקור בפורום CODE613 ב12/02/2014 19:45 (+02:00)
-
ועיין כאן:
http://msdn.microsoft.com/en-us/library/office/gg264421.aspx
במקטע:
Writing code that works on both 32-bit and 64-bit Officeפורסם במקור בפורום CODE613 ב12/02/2014 19:50 (+02:00)
-
תודה רבה לכל המשתתפים
עכשיו הכל עובד מצויין!!! בעיקר דוד ל.ט.
לרחמים את הלונג האחרון לא היה צריך באמת להחליף זה היה צעד מיותר, הקוד עובד גם ככה.
אתה משאיר אחריך הרבה ערפל, מה הסתדר? איך זה?
מעניין, כי דוקא ברחבי האינטרנט ראיתי בדיוק כמו שרחמים אמר.פורסם במקור בפורום CODE613 ב12/02/2014 20:28 (+02:00)
-
כנראה שסידרת הבדיקות שערכתי לא היו שיטתיות, בסוף מצאתי שעשיתי משהו לא נכון בקוד של הבדיקה, וזה הביא אותי לטעות ולחשוב שהבעיה בקוד היא בפונקציית ה API. אבל כרגע הכל עובד עם הפתרון שלך. ה Long הסופי הוא בסדר, היה צריך להחליף את הטיפוסים רק בתוך הארגומנטים.
יכול להיות שמה שכתוב באינטרנט זה נוגע למעשה איפה שאתה מעביר את הערכים לעוד API. אבל אם הערכים מטופלים ב vba זה חוזר להתנהגות רגילה של Long. הסיפור שם קשור לכתובות בזיכרון וסוגי דברים כאלו שממש קשורים לטרחני C++ ולא לאנשים אשר כמונו.....פורסם במקור בפורום CODE613 ב12/02/2014 20:32 (+02:00)
-
הסיפור שם קשור לכתובות בזיכרון וסוגי דברים כאלו שממש קשורים לטרחני C++ ולא לאנשים אשר כמונו.....
העיקרון הוא פשוט. ברגע שהמערכת הפעלה מקצה קטע בזיכרון לתוכנה. היא שולחת פרמטר מספר שמיצג כתובת בזיכרון.
אם יש לך 4 גיגה אז כאילו הזיכרון זה משתנה גלובלי מערך של בתים באורך 4 גיגה. והמספר זה מספר האיבר במערך שמתחילה ההקצאה.
את האורך ההקצאה התוכנה יודעת כי היא ביקשה הקצאה של X בתים אז מספיק שחוזר המיקום, במקרה אין מקום בזיכון חוזרת כתובת 0 שזה מסמל על שגיאהבמערכות 32 ביט המספר שמיצג את הכתובת בזיכרון הוא uint32 שזה אומר שהכתובת המקסימלית זה בערך 4 מליארד. ולכן זה הסיבה ש32ביט לא משתמש ביותר מ4 גיגה זיכרון ראם. במערכות 64 הכתובת היא uint64 ולכן צריך לשנות את הטיפוס לזה.
פורסם במקור בפורום CODE613 ב12/02/2014 21:15 (+02:00)