PDA

View Full Version : سوال: نوشتن Resource در یک فایل دیگر و خواندن آن؟



papa_toop
سه شنبه 05 آبان 1394, 07:08 صبح
سلام و وقت بخیر

من با کد زیر در یک فایل کامپایل شده که سورس دست من هست یک Resource ایجاد میکنم



Module ResourceWriter
Private Function ToPtr(ByVal data As Object) As IntPtr
Dim h As GCHandle = GCHandle.Alloc(data, GCHandleType.Pinned)
Dim ptr As IntPtr
Try
ptr = h.AddrOfPinnedObject()
Finally
h.Free()
End Try
Return ptr


End Function


<DllImport("kernel32.dll", SetLastError:=True)>
Private Function UpdateResource(ByVal hUpdate As IntPtr, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As UShort, ByVal lpData As IntPtr, ByVal cbData As UInteger) As Boolean
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Private Function BeginUpdateResource(ByVal pFileName As String, <MarshalAs(UnmanagedType.Bool)> ByVal bDeleteExistingResources As Boolean) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Private Function EndUpdateResource(ByVal hUpdate As IntPtr, ByVal fDiscard As Boolean) As Boolean
End Function




Public Function WriteResource(ByVal filename As String, ByVal bytes As Byte()) As Boolean


Try
Dim handle As IntPtr = BeginUpdateResource(filename, False)
Dim file1 As Byte() = bytes
Dim fileptr As IntPtr = ToPtr(file1)
Dim res As Boolean = UpdateResource(handle, "RT_RCDATA", "0", 0, fileptr, Convert.ToUInt32(file1.Length))
EndUpdateResource(handle, False)
Catch ex As Exception
Return False
End Try
Return True


End Function
End Module



و با کد زیر که در فایل دوم نوشته شده میخوام مقدار اون رو بگیرم


Module gsoijdMkeytY
<DllImport("kernel32.dll", SetLastError:=True)>
Private Function FindResource(ByVal ZlsTnllYezlL As IntPtr, ByVal lpName As String, ByVal lpType As String) As IntPtr
End Function
Private Declare Function JNBJGAPChMdi Lib "kernel32" Alias "GetModuleHandleA" (ByVal moduleName As String) As IntPtr
Private Declare Function SizeofResource Lib "kernel32" (ByVal ZlsTnllYezlL As IntPtr, ByVal hResInfo As IntPtr) As Integer
Private Declare Function LoadResource Lib "kernel32" (ByVal ZlsTnllYezlL As IntPtr, ByVal hResInfo As IntPtr) As IntPtr
Public Function CoqalHyeEZps(ByVal MVHjXxNPwlcC As String) As Byte()
Dim ZlsTnllYezlL As IntPtr = JNBJGAPChMdi(MVHjXxNPwlcC)
Dim PcOKouMcMJaW As IntPtr = FindResource(ZlsTnllYezlL, "0", "RT_RCDATA")
Dim JDDcSAvEjWmg As IntPtr = LoadResource(ZlsTnllYezlL, PcOKouMcMJaW)
Dim FOLUbFmExmUo = SizeofResource(ZlsTnllYezlL, PcOKouMcMJaW)
Dim fEUUehyJxiz As Byte() = New Byte(FOLUbFmExmUo - 1) {}
Marshal.Copy(JDDcSAvEjWmg, fEUUehyJxiz, 0, CInt(FOLUbFmExmUo))
Return fEUUehyJxiz
End Function
End Module


با فراخوانی


Dim getfile As Byte() = CoqalHyeEZps(Application.ExecutablePath)
Dim FileAsString = Encoding.Default.GetString(getfile)
Dim Info() As String = Split(FileAsString, "RT_RCDATA")
Dim views As String = Info(1)


اما بعد از اجرا در خط


Marshal.Copy(JDDcSAvEjWmg, fEUUehyJxiz, 0, CInt(FOLUbFmExmUo))

ارور


An unhandled exception of type 'System.ArgumentNullException' occurred in WindowsApplication1.exe

میده !!!!

مشکل از کجاست؟

آیا راه دیگه ای وجود داره؟