|
{ char Test[256]; strcpy(Test,lpszName); //为什么此条语句不能做???(问题出处) //经常出现cc3250mt.dll调用出错。 //原因是不是内存做了什么保护什么的? } 请各位编程Expert指点迷津!!!,以上思路对吗?还有没有更好的别的办法! |
|
|
|
。。。
char Test[256]; ~~~~~~~、你这是在堆栈中分配的内存, 函数调用过后过不用了,自然不行。 你的思路也不大对, 每次枚举一个资源,便调用一次这回调函数, 你这样是无法取得资源信息的。 strcpy(Test,lpszName); 。。。 既然用的是BCB ,那做起来就比较简单: 你可以用一个TStrings之类的来保存取得的资源名 比如加一个ListBox 然后在回调函数中这样写: { Form1->ListBox1->Items->Add(AnsiString(lpszName)); } |
|
|
哦, 原来你没有明白回调函数。
先声明一下你定义的回调函数: BOOL CALLBACK EnumRNameProc( //这函数名是什么没有关系,你 //定义的是什么名字就是什么名字. HANDLE hModule, // resource-module handle LPCTSTR lpszType, // pointer to resource type LPTSTR lpszName, // pointer to resource name LONG lParam // application-defined parameter ) { ... Form1->ListBox1->Items->Add(AnsiString(lpszName)); return true; } 然后在需要时候这样调用: EnumResourceNames(hDLL,RT_BITMAP, //hDll 你载入DLL的句柄. (ENUMRESNAMEPROC)EnumRNameProc, 0 ); //这儿只是列出Bitmap资源. |
|
|
另外要注意,传给回调函数的lpName不一定是字串,要判断不然会出内存错误:
// Write the resource name to a resource information file. // The name may be a string or an unsigned decimal // integer, so test before printing. if ((ULONG)lpName & 0xFFFF0000) { cbString = sprintf(szBuffer, "\tName: %s\n", lpName); } else { cbString = sprintf(szBuffer, "\tName: %u\n", (USHORT)lpName); } |
|
|
用sprinft(..,"%u",..)转换后怎么转回来呢?
|
|