رفع مشکلات و باگ ها، ارائه پیشنهادات و انتقادات نرم افزار آگرین
بسم الله الرحمن الرحیم.
عنوان تاپیک باید گویای همه چیز باشه.
اونایی که مایلن نرم افزار رو دانلود کنن
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بزنن.
این تاپیک برای رفع اشکالات و ارائه پیشنهادات و انتقادات هست.
نقل قول:
تابع System.Drawing.Icon.ExtractAssociatedIcon دات نت از تابع IntExtractAssociatedIcon در shell32 استفاده میکند (خروجی اش همان hIcon است) در پایان کار هم منابع را با DestroyIcon آزاد کنید... حدس میزنم بقیه اش برایتان کاری ندارد، مشکلی بود بفرمائید.
برای این یکی هم میتوانید از تابع SHBrowseForFolder استفاده کنید، که بدلیل آنکه کمی پیچیده تر است، کد حداقلی اش را برایتان میگذارم، (این کد قابلیت توسعه بیشتری دارد)
کد:
public class FolderBrowserDialog
: Microsoft.Win32.CommonDialog
{
private const int MAX_PATH = 260;
private string m_SelectedPath;
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
private struct BROWSEINFO
{
public IntPtr hwndOwner;
public IntPtr pidlRoot;
public IntPtr pszDisplayName;
public string lpszTitle;
public int ulFlags;
public IntPtr lpfn;
public IntPtr lParam;
public int iImage;
}
[System.Runtime.InteropServices.DllImport("shell32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern IntPtr SHBrowseForFolder(BROWSEINFO lpbi);
[System.Runtime.InteropServices.DllImport("shell32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool SHGetPathFromIDList(IntPtr pidl, System.Text.StringBuilder pszPath);
[System.Runtime.InteropServices.DllImport("ole32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern void CoTaskMemFree(IntPtr pv);
public override void Reset() { this.m_SelectedPath = null; }
public string SelectedPath { get { return this.m_SelectedPath; } }
protected override bool RunDialog(IntPtr hwndOwner)
{
this.Reset();
IntPtr iBuffer = System.Runtime.InteropServices.Marshal.AllocHGlobal(MAX_PATH * System.Runtime.InteropServices.Marshal.SystemDefaultCharSize);
IntPtr IdList = IntPtr.Zero;
try
{
var info = new BROWSEINFO();
info.pszDisplayName = iBuffer;
info.hwndOwner = hwndOwner;
info.ulFlags = 0x50;
IdList = SHBrowseForFolder(info);
if (IdList == IntPtr.Zero) return false;
var sBuffer = new System.Text.StringBuilder(MAX_PATH);
SHGetPathFromIDList(IdList, sBuffer);
return !string.IsNullOrEmpty(this.m_SelectedPath = sBuffer.ToString());
}
finally
{
if (IdList != IntPtr.Zero) CoTaskMemFree(IdList);
if (iBuffer != IntPtr.Zero) System.Runtime.InteropServices.Marshal.FreeHGlobal(iBuffer);
}
}
}
مثل دیالوگ فایل میتوانید از کلاس فوق استفاده کنید.
میبخشید، فراموشی و حواس پرتی من بود... شما باید در EntryPoint نام تابع مورد نظر را قرار دهید.
پست قبلی ویرایش شد.
در مورد پلتفرم هم منظورم پلتفرم نرم افزاری بود نه سخت افزاری.
حسن جان من System.Windows.Forms رو برداشتم و تابع شمارو گذاشتم.
اما این کلاس چند تا مشکل داره:
1.هنگامی که آدرس درست نیست مثل My Computer و Recyle Bin و .. دکمه OK فعال هست.
2.دکمه New Folder نداره.که کاربر بتونه پوشه بسازه.
3.وقتی پوشه ای رو انتخاب میکنم متاسفانه با خطایی مواجح میشم یه جورایی ویژوال استادیو متوفق میشه ولی Play بزنم برنامه دوباره کار میکنه.یعنی اگه برنامه رو ریلیز کنم این خطا دیگه موجود نیست ولی امکان داره مشکل ایجاد کنه.
در مورد ExtractAssociatedIcon راستش منم دوست دارم از این استفاده کنم ولی برای اینکه بخوام آیکن یک پسوند رو بگیرم مجبور میشم یک فایل بسازم.که این بهینه و جالب نیست که برای هر پسوند یه فایل بسازم و آیکن رو بگیرم و فایل رو حذف کنم.به نظرت راه بهینه تری نیست؟اخه تابعی که من دارم استفاده میکنم نیاز به ساختن فایل نداره.
در مورد API ها هم من نام دادم به این صورت:
کد:
[DllImport("shell32.dll")]
internal static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes,
ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
متوجه نشدم که چه چیز مونده برای تغییرات.
:40::11:.