דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. פונקציית StrPtr עושה בעיות ב 64 ביט

פונקציית StrPtr עושה בעיות ב 64 ביט

מתוזמן נעוץ נעול הועבר ארכיון code613m
22 פוסטים 5 כותבים 1.2k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    ארכיטקט
    כתב ב נערך לאחרונה על ידי
    #1

    שלום לכולם, יש פונקצייה אזוטרית בשם StrPtr שהיא נמצאת בשימוש בתוך פונקציית API של windows אם אני מבין נכון, אני הורדתי קוד מהאינטרנט בלי להבין יותר מדאי, ועכשיו כשאני בא להשתמש בגירסת 64 ביט של אופיס, הוא עושה שגיאה:

    Private Const CP_UTF8 = 65001
    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
    
    Public Function UTF16To8(ByVal UTF16 As String) As String
    Dim sBuffer As String
    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
    

    הודעת השגיאה: type mismatch
    מחיפוש בגוגל לא כל כך הצלחתי למצוא פתרון פשוט ויעיל.

    פורסם במקור בפורום CODE613 ב12/02/2014 14:48 (+02:00)

    אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

    תגובה 1 תגובה אחרונה
    0
    • רחמיםר מנותק
      רחמיםר מנותק
      רחמים מורחק
      כתב ב נערך לאחרונה על ידי
      #2

      תנסה כך:

      CLong(StrPtr(UTF16))
      

      פורסם במקור בפורום CODE613 ב12/02/2014 14:54 (+02:00)

      תגובה 1 תגובה אחרונה
      0
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #3

        ויש גם את זה:
        http://support.microsoft.com/kb/983246

        פורסם במקור בפורום CODE613 ב12/02/2014 15:03 (+02:00)

        תגובה 1 תגובה אחרונה
        0
        • א מנותק
          א מנותק
          ארכיטקט
          כתב ב נערך לאחרונה על ידי
          #4

          @רחמים

          תנסה כך:

          CLong(StrPtr(UTF16))
          

          זה לא עובד כי הAPI לא מכיר את הפונקציה הזאת של CLong הודעת שגיאה.
          @רחמים

          ויש גם את זה:
          http://support.microsoft.com/kb/983246

          אין שם שורת קוד אחת של פתרון, אני לא מצליח להבין מה כתוב שם... :? :? :?

          פורסם במקור בפורום CODE613 ב12/02/2014 15:17 (+02:00)

          אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

          תגובה 1 תגובה אחרונה
          0
          • dovidD מחובר
            dovidD מחובר
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #5

            אני חושב שבעייתך מוזכרת במאמר זה.

            אם הבנתי את האנגלית טוב, אתה אמור להחליף כל Long המופיע בDeclare לLongPtr.

            פורסם במקור בפורום CODE613 ב12/02/2014 15:34 (+02:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            2
            • clickoneC מנותק
              clickoneC מנותק
              clickone
              כתב ב נערך לאחרונה על ידי
              #6

              ארכיטקט, סליחה על הבורות.
              מה הסיבה להשתמש ב64 ביט?
              יותר טוב, או סתם בגלל שזה מה שמותקן אצל הלקוח?
              זה שווה את ניהול 2 הגירסאות? (אפילו שזה לא בקוד אלא בMDE)

              פורסם במקור בפורום CODE613 ב12/02/2014 17:12 (+02:00)

              אין טסט כמו פרודקשן.

              המייל שלי urivpn@gmail.com

              תגובה 1 תגובה אחרונה
              0
              • M מנותק
                M מנותק
                magicode
                כתב ב נערך לאחרונה על ידי
                #7

                כנראה זה מה שמותקן לו (לארכיטקט) במחשב.
                אתה רוצה שהוא יתקין 32 רק בשביל זה או אולי מכונה ורטואלית. רק בשביל להחליף utf16 ל utf8 .

                פורסם במקור בפורום CODE613 ב12/02/2014 17:56 (+02:00)

                תגובה 1 תגובה אחרונה
                0
                • clickoneC מנותק
                  clickoneC מנותק
                  clickone
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @magicode

                  כנראה זה מה שמותקן לו (לארכיטקט) במחשב.
                  אתה רוצה שהוא יתקין 32 רק בשביל זה או אולי מכונה ורטואלית. רק בשביל להחליף utf16 ל utf8 .

                  אני לא מאמין שזו הסיבה. (כי אם כן אז הוא מחייב את כלל הלקוחות שלו להיות ב64 ביט ולא נראה לי שזה המצב [יותר אני מאמין שזה הפוך - שיש לו לקוח עם 64 ביט])
                  אבל למה רק ארכיטקט? יש כאן בפורום דוגמא למישהו שמתחזק 2 גירסאות 32 ו64...

                  פורסם במקור בפורום CODE613 ב12/02/2014 18:23 (+02:00)

                  אין טסט כמו פרודקשן.

                  המייל שלי urivpn@gmail.com

                  תגובה 1 תגובה אחרונה
                  0
                  • א מנותק
                    א מנותק
                    ארכיטקט
                    כתב ב נערך לאחרונה על ידי
                    #9

                    @ClickOne

                    ארכיטקט, סליחה על הבורות.
                    מה הסיבה להשתמש ב64 ביט?
                    יותר טוב, או סתם בגלל שזה מה שמותקן אצל הלקוח?
                    זה שווה את ניהול 2 הגירסאות? (אפילו שזה לא בקוד אלא בMDE)

                    נמאס לי להגיד ללקוחות מה להתקין ומה לא וכולי. מבחינת "ניהול" 2 גירסאות, לא נראה לי שיש כל כך בעיה חוץ מפונקציות API שעושים עם תנאי.
                    לפעמים הם מפרמטים את המחשב, ואז הטכנאי מתקין להם אופיס עוד פעם ואז שוב פעם מתקשרים שהתוכנה לא עובדת וכו' אין לי כוח לזה. אז עדיף לי להחזיק 2 גרסאות ברמת הקימפול בלבד וזהו.
                    אגב אם מישהו הצליח להבין את המאמרים המצורפים ופשוט להעלות קוד שיפתור את הבעיה, יזכה בפרס שהוא קוד VBA להשלמה אוטומטית של כל הערים והרחובות מדואר ישראל כולל מיקוד חדש בן 7 ספרות...... אם ירצה נתרום את הקוד לקהילה כאן.

                    פורסם במקור בפורום CODE613 ב12/02/2014 18:39 (+02:00)

                    אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                    תגובה 1 תגובה אחרונה
                    1
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי
                      #10

                      ארכיטקט, ניסית את הLongPtr?

                      פורסם במקור בפורום CODE613 ב12/02/2014 18:43 (+02:00)

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      0
                      • א מנותק
                        א מנותק
                        ארכיטקט
                        כתב ב נערך לאחרונה על ידי
                        #11

                        @דוד ל.ט.

                        ארכיטקט, ניסית את הLongPtr?

                        אוי ואבוי לי לא הבנתי את התשובה שלך מקודם, ושמתי את הערך במקום הלא נכון!!! עכשיו זה הסתדר ותודה רבה.

                        עכשיו נוצרה לי בעיה אחרת בעקבות ההמרה, אבל ככל הנראה לא קשור לאשכול הזה.

                        לגבי הפרס תחליט אתה, זאת שאלה מוסרית, מה הדין אם מבטיחים פרס אחרי שכבר מצאו את בן לאדן....... :lol: :lol: :lol: :lol:

                        פורסם במקור בפורום CODE613 ב12/02/2014 18:56 (+02:00)

                        אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                        תגובה 1 תגובה אחרונה
                        0
                        • dovidD מחובר
                          dovidD מחובר
                          dovid ניהול
                          כתב ב נערך לאחרונה על ידי
                          #12

                          אני מעדיף שלא תביא את הפרס לפורום, כי זה יעודד אנשים לעבוד באקסס, בראותם שהמוחות החריפים שוכנים שם.

                          אל תשכח לסמן את האשכול כפתור.

                          פורסם במקור בפורום CODE613 ב12/02/2014 19:02 (+02:00)

                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                          תגובה 1 תגובה אחרונה
                          3
                          • clickoneC מנותק
                            clickoneC מנותק
                            clickone
                            כתב ב נערך לאחרונה על ידי
                            #13

                            @ארכיטקט

                            @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)

                            אין טסט כמו פרודקשן.

                            המייל שלי urivpn@gmail.com

                            תגובה 1 תגובה אחרונה
                            0
                            • א מנותק
                              א מנותק
                              ארכיטקט
                              כתב ב נערך לאחרונה על ידי
                              #14

                              טוב קודם כל נפתר לא ממש, כי הדיבוג עובר, אבל בסופו של יום הפונקציה לא מחזירה לי כל ערך, אני אציג את הקוד שעשיתי:

                              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 לא מחזירה לי כל ערך.

                              @ClickOne

                              מה זה קוד השלמה אוטו' של כל הערים וכו?
                              אתה מתכוון לזה?

                              לא! זה קובץ XML שלוקח לו שבוע לעלות ושוקל המון, אתה צריך להחזיק אותו אצל הלקוח, בקיצור לא יעיל בעליל. אני מדבר על קוד שמתקשר אונליין עם השרת של דואר ישראל, ומושך ממנו מידע של השלמה אוטומטית, של ערים, ולאחר מכן של הרחובות באותה עיר, אבל אני לא ימרה את פיו של מנהל הפורום.

                              לגבי עידוד שימוש באקסס, אני מצהיר בזאת שאני משתמש בזה מתוך אילוץ גמור, הואיל ואני כרגע מתפרנס מזה, אבל אני בתהליך של הגירה, יעיד כל כך מג'יקוד...

                              בכל אופן אני עדיין לא יכול לסמן את הבעיה כנפתרה, כל עוד הפונקציה URLEncode לא מחזירה לי כל ערך..

                              פורסם במקור בפורום CODE613 ב12/02/2014 19:18 (+02:00)

                              אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                              תגובה 1 תגובה אחרונה
                              0
                              • dovidD מחובר
                                dovidD מחובר
                                dovid ניהול
                                כתב ב נערך לאחרונה על ידי
                                #15

                                אשמח לבדוק, אבל תוכל לכוון אותי מה עובד ומה לא ואיזה פרמטרים להכניס בבדיקה?

                                פורסם במקור בפורום CODE613 ב12/02/2014 19:32 (+02:00)

                                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                תגובה 1 תגובה אחרונה
                                0
                                • רחמיםר מנותק
                                  רחמיםר מנותק
                                  רחמים מורחק
                                  כתב ב נערך לאחרונה על ידי
                                  #16

                                  @ארכיטקט

                                  #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)

                                  תגובה 1 תגובה אחרונה
                                  1
                                  • רחמיםר מנותק
                                    רחמיםר מנותק
                                    רחמים מורחק
                                    כתב ב נערך לאחרונה על ידי
                                    #17

                                    ועיין כאן:
                                    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)

                                    תגובה 1 תגובה אחרונה
                                    1
                                    • א מנותק
                                      א מנותק
                                      ארכיטקט
                                      כתב ב נערך לאחרונה על ידי
                                      #18

                                      @רחמים

                                      לא החלפת את הלונג האחרון ל LongPtr

                                      החלפתי וזה עושה שגיאה ב: sBuffer = space$(lLength) כי הוא מצפה לערך מסוג Long

                                      פורסם במקור בפורום CODE613 ב12/02/2014 20:20 (+02:00)

                                      אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                                      תגובה 1 תגובה אחרונה
                                      0
                                      • א מנותק
                                        א מנותק
                                        ארכיטקט
                                        כתב ב נערך לאחרונה על ידי
                                        #19

                                        תודה רבה לכל המשתתפים :smile: :smile: :smile: :smile:

                                        עכשיו הכל עובד מצויין!!! בעיקר דוד ל.ט.

                                        לרחמים את הלונג האחרון לא היה צריך באמת להחליף זה היה צעד מיותר, הקוד עובד גם ככה.

                                        פורסם במקור בפורום CODE613 ב12/02/2014 20:25 (+02:00)

                                        אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                                        תגובה 1 תגובה אחרונה
                                        1
                                        • dovidD מחובר
                                          dovidD מחובר
                                          dovid ניהול
                                          כתב ב נערך לאחרונה על ידי
                                          #20

                                          @ארכיטקט

                                          תודה רבה לכל המשתתפים :smile: :smile: :smile: :smile:

                                          עכשיו הכל עובד מצויין!!! בעיקר דוד ל.ט.

                                          לרחמים את הלונג האחרון לא היה צריך באמת להחליף זה היה צעד מיותר, הקוד עובד גם ככה.

                                          אתה משאיר אחריך הרבה ערפל, מה הסתדר? איך זה?
                                          מעניין, כי דוקא ברחבי האינטרנט ראיתי בדיוק כמו שרחמים אמר.

                                          פורסם במקור בפורום CODE613 ב12/02/2014 20:28 (+02:00)

                                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                          תגובה 1 תגובה אחרונה
                                          0

                                          • 1
                                          • 2
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום